2013-12-16 2 views
1

Я хотел бы повторно отобразить компонент, когда пользователь из списка целевого списка выбора выбирает элемент.Primefaces p: picklist - как я фиксирую событие выбора элемента в целевом списке?

Как это сделать?


UPDATE (17 декабря 2013)

Я описал полное решение этой проблемы здесь - http://leonotepad.blogspot.com.br/2013/12/primefaces-capturing-target-list-item.html

Благодаря @Hatem я не мог решить эту проблему без вашего ответа.

В принципе, это было так:

У меня есть @ViewScoped управляемый компонент с р: PickList отфильтрованный по р: компонент SelectMany с помощью р: Ajax события обновления.

Как это

<p:outputLabel for="siteFilter" value="Site Filter:" style="width:100px;"/> 
<p:selectOneMenu converter="#{siteTypeConverter}" id="siteFilter" value="#{myMB.selectedSiteType}" style="width:200px;">    
    <f:selectItem itemLabel="Select Site Type" itemValue="#{null}" /> 
    <f:selectItems value="#{myMB.siteTypeFilterList}" var="st" itemLabel="#{st.name}" itemValue="#{st}" /> 
    <p:ajax update="sites" listener="#{myMB.handleSiteTypeFilterChange}" oncomplete="rebindClicks()"/> 
</p:selectOneMenu> 

<p:outputLabel for="sites" value="Sites:" style="width:100px;"/> 
<p:pickList 
    widgetVar="xyzabc" 
    id="sites" 
    value="#{myMB.sites}" 
    var="site"     
    converter="#{siteConverter}" 
    itemLabel="#{site.siteType.name}.#{site.name}" 
    itemValue="#{site}" /> 

Идея заключается в том, чтобы вызвать новое событие, когда пользователь нажимает на каком-то PickList целевого элемента списка.

Итак, как было предложено @Hatem, мы должны привязать событие click к каждому из целевых элементов. Нравится

(...) 
    <p:remoteCommand name="updateCommand" action="#{myMB.updateAccounts}" update="accounts"/> 
</h:form> 
<h:outputScript library="js" name="pickListHack.js" /> 
(...) 

Обратите внимание, что я должен был добавить его ПОСЛЕ формы.

и pickListHack.js расположен на WebContent/ресурсы/JS/pickListHack.js

function rebindClicks() { 
    xyzabc.jq.on('click','.ui-picklist-target li',function(){ 
     var item = $(this).attr('data-item-value'); 
     alert(item); 
     updateCommand([{name:'param', value:item}]); 
    }); 
}; 

$(document).ready(function() { 
    rebindClicks(); 
}); 

Хитрость здесь, кажется, что после события обновления, оков теряются, поэтому мы должны пересвязать их после обновления. Вот почему p: ajax имеет это незавершенное событие.

И наконец, когда пользователь нажимает на элемент из целевого списка, мы вызываем updateCommand, объявляемый через p: remoteCommand.

Обратите внимание, что выбранный элемент передается как параметр с именем «param». Мы получаем этот параметр обратно в управляемом компоненте, как этот

public void updateAccounts(){ 
    String value = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("param"); 
    System.out.println(">"+value); 
    this.accounts = value; 
} 

В этом случае значение только ID, потому что это то, что мой siteConverter делает к объекту.

@ManagedBean 
@RequestScoped 
public class SiteConverter implements Converter,Serializable{ 
    private static final long serialVersionUID = -194442504109002565L; 

    @EJB 
    private MyEJB myEJB; 

    @Override 
    public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) 
      throws ConverterException { 

     if (arg2 != null){ 
      Site s = myEJB.getSiteById(Long.parseLong(arg2)); 
      return s; 
     }else{ 
      return null; 
     } 
    } 

    @Override 
    public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) 
      throws ConverterException { 

     if (arg2 != null){ 
      Site s = (Site)arg2; 
      return String.valueOf(s.getId()); 
     }else{ 
      return null; 
     } 
    } 
} 
+0

Ваш вопрос мог бы использовать гораздо больше деталей. Вы имеете в виду, когда элемент выделен в целевом списке? Или когда происходит передача? – kolossus

+0

В подборке есть два списка, источник и цель. Событие, которое я ищу, - это когда пользователь выбирает элемент из списка целевого списка выбора. Это отличается от события переноса. Вы даже можете предположить, что оба списка поставляются с предварительно инициализированными элементами в обеих сторонах, и пользователь выбирает конкретный целевой элемент перед любым событием передачи (если есть) –

ответ

1

Этот способ должен это сделать.

remoteCommand

<p:remoteCommand name="updateCommand" update="componentId" /> 

р: Picklist

<p:pickList id="pickList" widgetVar="pickListVar" value="#{pickListBean.cities}" 
var="city" itemLabel="#{city}" itemValue="#{city}" /> 

JS

$(document).ready(function() { 
    PF('pickListVar').jq.on('click','.ui-picklist-target li',function(){ 
     updateCommand();//remoteCommand to update 
     //and you can get the item value and lable 
     $(this).attr('data-item-value'); 
     $(this).attr('data-item-lable'); 
    }); 
}); 

EDIT:

И если ваш pickList регулярно обновляется другим компонентом, вы потеряете событие click в конце концов.

В этом случае вы можете привязать клик к родительскому компоненту-контейнеру pickList.

Например:

$('#formId').on('click','.ui-picklist-target li',function(){ 
     updateCommand();//remoteCommand to update 
     //and you can get the item value and lable 
     $(this).attr('data-item-value'); 
     $(this).attr('data-item-lable'); 
    }); 

Но опять-таки, если какой-либо другой компонент, обновил всю форму, вы потеряете событие связывания ..

+0

Я этого не понимаю. Как вы связываете функцию javascript и pickList? – kolossus

+0

Я ничего не связываю, так как вывод pickList является нормальным HTML! Я делаю пару [jQuery selects] (http://api.jquery.com/category/selectors/) на основе классов css выбора и [hook event event] (http://api.jquery.com/ on /) определенного элемента dom (например, li), и когда этот элемент щелкнут, это означает, что он выбран. просто я вызываю remoteCommand, когда он выбран. @kolossus –

+0

@HatemAlimam, этот ответ имеет смысл. Хотя, я не знаю, почему мой браузер говорит, что pickListVar не определен. (widgetVar не работает?). Если я пытаюсь вызвать jq из ID [например, $ ('# am \\: sites'). Jq.on (...)], я получаю «TypeError: $ (...). Jq undefined». Если я попробую оповещение ($ ('# am \\: sites')); $ (document) .ready (function() { \t $ ('# am \\: sites'). On ('click', '. Ui-picklist-source li', function() { alert ($ (this) .attr ('data-item-value')); }); }) ;, объект не является нулевым, нет сообщений об ошибке, но ничего не происходит :-( –