0

我得到了以下场景:我有几个选项卡(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 的示例:使用组件 ID(id vs clientId)(从 2009 年开始)

并添加了对 inputtext 的绑定,就像这样binding="#{lookup.components.comment4Dialog}",在我更改为的对话框的 p:commandButton 中update="#{lookup.clientIds.comment4Dialog}"

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

提前谢谢,

4

1 回答 1

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 嵌套在 ap:outputPanel 中,或者在极少数情况下嵌套在子视图 id 中。通过指定完整路径 ':subview:form:component' 可能是一个非常简单的修复,但情况并非如此。

于 2011-11-27T03:24:10.063 回答