Обновление Ajax не работает

#ajax #jsf #primefaces

#ajax #jsf #простые интерфейсы

Вопрос:

Почему #{uImanager.select} никогда не обновляется?

 <p:panel id="EditDetailsPanel" header="Edit Details">
    <h:panelGrid columns="2" cellpadding="5">
        <h:outputLabel value="Simple :" />
        <h:selectOneMenu value="#{uImanager.select}">
            <f:selectItem itemValue="val1" itemLabel="Coffee1" />
            <f:selectItem itemValue="val2" itemLabel="Coffee2" />
            <f:selectItem itemValue="val3" itemLabel="Coffee3" />                                  
        </h:selectOneMenu>
    </h:panelGrid>
    <p:commandButton value="Submit" update="EditDetailsForm:EditDetailsPanel"/>
    #{uImanager.select}
</p:panel> 
  

Он указывает на a private String Select; с помощью getter и setter. Оно определено в управляемом компоненте с областью сеанса.

Ответ №1:

Потому что ваш update атрибут, вероятно, указывает на недопустимый идентификатор клиента. Если вы обратили внимание на журналы сервера, то вы должны были увидеть что-то вроде следующего из PrimeFaces:

 INFO: Cannot find component with identifier "EditDetailsForm:EditDetailsPanel" in view.
  

Поскольку <p:panel> он находится внутри того же UINamingContainer родительского <p:commandButton> элемента, что и сам (по крайней мере, на основе кода, который вы опубликовали до сих пор), вы можете просто указать его относительный идентификатор клиента:

 <p:commandButton value="Submit" update="EditDetailsPanel"/>
  

Или, если вы настаиваете на указании абсолютного идентификатора клиента, вам нужно добавить к нему префикс : :

 <p:commandButton value="Submit" update=":EditDetailsForm:EditDetailsPanel"/>
  

Обратите внимание, что это работает только в том случае, если <h:form> у самого does нет другого UINamingContainer родителя. Откройте страницу в браузере, щелкните правой кнопкой мыши и просмотрите исходный код, чтобы узнать сгенерированный идентификатор элемента HTML. Наконец, вам нужно принять это значение с префиксом : .

Комментарии:

1. Это не проблема. этот код находится в форме с id=»EditDetailsForm»

2. Это не должно иметь значения. Относительные идентификаторы клиентов преобразуются в текущий UINamingContainer родительский. Если вы действительно настаиваете на указании длинных и абсолютных идентификаторов клиентов, тогда вам нужно добавить к нему префикс : . Но я не понимаю, как это полезно. Просто используйте значение, указанное в моем ответе.

3. Я изменил обновление на EditDetailsPanel, а также на:EditDetailsForm:EditDetailsPanel, но без шансов.в parrent нет UINamingContainer

4. Решаемая. этот код находится в <c:if test=»${param.subpage == ‘EditDetails’}»> Я добавляю <f:param name=»subpage» value=»EditDetails»/> в CommandButton, и теперь он работает

5. Хорошо. В будущем не оставляйте эту деталь без внимания.