#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. Хорошо. В будущем не оставляйте эту деталь без внимания.