来自<h:form> </h:form>之外的数据表的引用表单组件

时间:2012-08-08 06:24:00

标签: javascript ajax jsf xhtml

我想从命令链接中的数据表标记引用下面表单中的组件id = contractIdInputText。我想在render属性中使用它的'id而不是@all。我之所以使用@all只是因为我无法引用id。数据表位于标记之外和之上。

<h:form id="contracts">
   <h:outputScript library="js" name="common.js" target="head"/>
   <h:panelGrid columns="3"   columnClasses="rightalign,leftalign,leftalign">

   <h:outputLabel for="contractIdInputText" rendered="true" value="Contract Nooo.: " />
   <h:inputText id="contractIdInputText" required="true"                                         value="#contractManager.newContractId}" />
</form>

这是数据表的命令链接:

 <h:commandLink id="editLink" value="#{bundle.ListUnitEditLink}" 
     action="#{contractManager.updateContract}">
     <f:ajax onevent="disablePK" render="@all" />
 </h:commandLink>

链接中ajax的全部目的是在单击commandlink并填充表单时禁用表单组件。我也注意到,使用@all执行我想要的操作(在禁用inputText的情况下填充表单),这导致我需要在数据表中的commandlink上单击commandlink两次,以​​便用另一个填充表单项目。为什么会这样?

1 个答案:

答案 0 :(得分:1)

如果它们不在同一个NamingContainer父级中,那么您应该通过其绝对客户端ID而不是(无效的)相对客户端ID引用其他组件。绝对客户端ID是完整的客户端ID(如生成的HTML输出中所示),前缀为命名容器分隔符(默认为:)。

所以,这应该做

<f:ajax ... render=":contracts:contractIdInputText" />

(假设<form id="contracts">本身不在另一个NamingContainer父级中,再次检查生成的HTML输出以确定)

至于为什么需要两次点击命令链接,这很可能与JSF spec issue 790有关。修复方法是在render中明确包含其他表单。另请参阅Ajax rendering of content which contains other form