2012-06-23 2 views
0

Я действительно застрял в этом в течение последних 2 дней, и я изо всех сил пытаюсь понять, как Primefaces обновляет компоненты пользовательского интерфейса на клиенте на основе их идентификатора.JSF 2/Primefaces p: ajax не обновляет панель после события onchange

У меня есть h: selectOneMenu с подсчетом количества отображаемых панелей. Каждая панель p: будет содержать панель Grid с многочисленными элементами формы. Событие onchange на выпадающем списке запущено, и я вижу счет в управляемом компоненте. Я не вижу панелей, динамически растущих на стороне клиента. Я думаю, что что-то не так с моими параметрами p: ajax, но я не полностью понимаю, как это работает. здесь находится соответствующий код:

<h:selectOneMenu id="numapps" value="#{mbean.appCount}"> 
       <f:selectItem itemLabel="1" itemValue="1" /> 
       <f:selectItem itemLabel="2" itemValue="2" /> 
       <f:selectItem itemLabel="3" itemValue="3" /> 
       <f:selectItem itemLabel="4" itemValue="4" /> 
       <f:selectItem itemLabel="5" itemValue="5" /> 
       <p:ajax update="appsContainer" event="change" 
        listener="#{mbean.onChangeNumApps()}" />  
    </h:selectOneMenu> 

    <p:panel id="appsContainer" > 
      <p:panel header="Application" id="appsPane" value="#{mbean.submittedApps}" var="app" multiple="true"> 

ПредставленныйApps - это список, содержащий элементы панели. Вот мой MBean слушатель:

public void onChangeNumApps() 
{ 
    List<Apps> c = new ArrayList<Apps>(); 
    logger.info("on change event fired"); 
    logger.info("new value is "+mbean.getAppCount()); 
    for (int i=0;i < mbean.getAppCount();i++) 
    { 
     c.add(new App()); 
    } 
    mbean.setSubmittedApps(c); 
} 

Я смешивания р: Ajax с ч: SelectOne, потому что я не мог получить р: SelectOne работает по какой-то причине - возможно, из-за столкновения CSS с моей таблицы стилей ??

ответ

0

Добавление/удаление динамического компонента из дерева JSF намного проще. Хотя я много работаю над RF и JSF2.0, поэтому я не буду в состоянии помочь вам с точки зрения кода для простых поверхностей, но я могу перечислить шаги, которые можно выполнить для добавления динамических компонентов на основе числа, полученного от слушатель valuechange.

В вашем посте вы должны иметь динамическое количество форменных элементов на основе значения, представленного от

Для этого на valuechanelistener вы можете получить значение числа панелей, выбранных.

  1. Вы создаете новую панель в значении changelistener.
  2. Создайте нужные элементы формы на основе числа, полученного от valuechangelistener.
  3. Добавьте эти элементы в качестве ребенка на панель.
  4. Добавьте эту панель в качестве дочернего элемента на панель, которая присутствует на странице ранее.

Вместо того, чтобы вручную назначать идентификатор каждому динамическому компоненту, вы можете использовать встроенную уникальную функцию JSF, которая автоматически предоставит вам уникальные идентификаторы. Если вам нужно дополнительно использовать динамические компоненты для вычитания значений, вам необходимо сохранить идентификаторы в отдельной коллекции и на основе идентификатора вы можете получить значение динамического компонента.

Чтобы получить уникальный идентификатор для компонента: -

FacesContext.getCurrentInstance() getViewRoot() createUniqueId();..

Для динамического добавления компонента в дереве JSF, пожалуйста, найти фрагмент кода указанный ниже: -

HtmlPanelGrid panelGrid=new HtmlPanelGrid(); 
panelGrid.setColumns(2); 
String uniqueId=FacesContext.getCurrentInstance().getViewRoot().createUniqueId(); 
panelGrid.setId(uniqueId); arrLstComponentIds.add(uniqueId); 
HtmlInputText inputText = new HtmlInputText();  
HtmlOutputLabel outputLabel=new HtmlOutputLabel(); 
              panelGrid.getChildren().add(outputLabel); 
panelGrid.getChildren().add(inputText); 
htmlGridElement = new HtmlPanelGrid();  htmlGridElement.getChildren().add(panelGrid); 

Вы должны засавить вашу панель, так что изменения в дереве JSF отражены.

0

Получил его работу с ui: повторение, а не повторение по панели.

Смежные вопросы