我想从命令链接中的数据表标记引用下面表单中的组件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两次,以便用另一个填充表单项目。为什么会这样?
答案 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。