Лучший способ получить реальный идентификатор компонента в именованном контейнере - PullRequest
0 голосов
/ 27 ноября 2011

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

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

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

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

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

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

Спасибо,

1 Ответ

2 голосов
/ 27 ноября 2011

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

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

//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), когда иногда идентификатор был вложен в p: outputPanel или в редких случаях идентификатор subview. Это может быть очень просто исправить, указав полный путь ': subview: form: component', хотя это не должно иметь место.

...