获取命名容器中组件的真实ID的更好方法

时间:2011-11-26 20:48:40

标签: jsf-2 primefaces naming-containers

我有以下情况: 我有几个标签(TabView是一个命名容器) 在其中一个我得到ap:inputText,它显示一个对话框(位于其他xhtml文件中),现在我希望对话框更新p:inputText,事实是p:inputText的id是未知的( JSF为它添加了一些前缀)

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

我无法在对话框中使用此update =“hoursReportFrm:comment4Dialog”

ATM我看了这个网站的例子JSF: working with component IDs (id vs clientId)(它来自2009年)

并添加了对inputtext的绑定,比如这个binding="#{lookup.components.comment4Dialog}"和对话框的p:commandButton我改为update="#{lookup.clientIds.comment4Dialog}"

并且它工作正常,但我正在寻找一种更好的方法,而不需要绑定我以后想要访问的每个组件......

非常感谢,

1 个答案:

答案 0 :(得分:2)

说实话,我认为绑定可能是最简单的方法,但是当我遇到这种情况时,我发现复合组件通常提供比绑定更好的解决方案。根据具体情况(以及完全不同的情况),您可以使用复合组件来解决此问题。这允许您创造性地重用页面的某些部分,以便您的特定更新不需要大量工作,您可以重用代码。

这方面的一个例子可能是:

//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>

通过将此视图分成一段可重用的代码,您可以解决指定完整路径的负担,因为现在它更容易重用。但是,根据具体情况,我认为这是绑定或复合组件的折腾。要重用,请创建一个新对象(组件)并重用它。如果您正在处理高度动态的环境:绑定它。

我无论如何都不是专家,但总的来说,上面让我摆脱了很多困难。

编辑:在重新阅读时,您还应该确保标签视图没有延迟加载,并查看渲染以确保路径正确(检查ID)。我遇到了问题(在Primefaces的旧版本中),有时id嵌套在p:outputPanel中,或者在极少数情况下嵌套在subview id中。通过指定完整路径':subview:form:component'可能是一个非常简单的修复,但不应该是这种情况。