Лучший способ получить реальный идентификатор компонента в именованном контейнере

Я получил следующий сценарий: я получил несколько вкладок (TabView является контейнером именования) и в одной из них я получил a p:inputText, который показывает диалог (который находится в другом файле xhtml), теперь я хочу, чтобы диалог обновлял p: inputText, дело в том, что идентификатор p: inputText неизвестен (JSF добавляет к нему некоторый префикс)

<h:form id="hoursReportFrm">
    <p:inputText id="comment4Dialog" value="#{hoursReportBean.aComment}" 
onfocus="dlg1.show();"/>

Я не могу использовать это обновление ="hoursReportFrm:comment4Dialog" в диалоговом окне

Банкомат я посмотрел на примере этого сайта JSF: работа с идентификаторами компонентов (id против clientId) (с 2009 года)

и добавил привязку к inputtext, как этоbinding="#{lookup.components.comment4Dialog}" и в p:commandButton диалогового окна я изменил на update="#{lookup.clientIds.comment4Dialog}"

и это работает просто отлично, но я ищу лучший способ, без необходимости связывать каждый компонент, к которому я хотел бы получить доступ позже...

Спасибо вперед,

1 ответ

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

Примером этого может быть:

//comp:myDialog
...
<composite:interface>
  <composite:attribute name="update" />
  <!-- Other attributes -->
</composite:interface>

<composite:implementation>
  ...
  <!-- Implementation -->
  <p:commandButton update="#{cc.attrs.update}"/>
  ...
</composite:implementation>

И здесь может быть компонент в использовании:

//for the sake of argument 'comp' as your library
<h:form id="someForm">
  <p:inputText value="#{bean.changeMe}" id="changeMe"/>
</h:form>

<h:form id="dialog">
  <!-- dialog here -->
  <comp:myDialog update="someForm:changeMe" />
</h:form>

Разделив это представление на фрагмент кода, который можно многократно использовать, вы сможете обойти бремя указания полного пути, потому что теперь его намного проще использовать повторно. Тем не менее, я думаю, что в зависимости от конкретного случая это связывание или составной компонент. Для повторного использования создайте новый объект (компонент) и используйте его повторно. Если вы имеете дело с высоко динамичной средой: связывайте ее.

Я ни в коем случае не эксперт, но в целом вышесказанное вывело меня из множества сложных ситуаций.

РЕДАКТИРОВАТЬ: при повторном чтении вы должны также убедиться, что представление вкладок не загружается лениво, и взглянуть на рендеринг, чтобы убедиться, что путь правильный (проверьте идентификатор). У меня были проблемы (в более старых версиях Primefaces), когда иногда идентификатор был вложен в a p:outputPanel или в редких случаях идентификатор subview. Это может быть очень просто исправить, указав полный путь ':subview:form:component', хотя это не должно иметь место.

Другие вопросы по тегам