【问题标题】:Reference form component from datatable outside <h:form>从 <h:form> 外部的数据表中引用表单组件
【发布时间】:2012-08-08 06:24:00
【问题描述】:

我想从命令链接中的数据表标签中引用下面表单中的组件 id=contractIdInputText。我想在渲染属性中使用它的 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 的全部目的是在我单击命令链接并填充表单时禁用表单组件。我还注意到,就像使用 @all 做我想要的一样(在禁用 inputText 的情况下填充表单),这导致我需要在数据表中的命令链接上单击命令链接两次才能用另一个填充表单物品。为什么会这样?

【问题讨论】:

  • 我将整个数据表放在
    标记中,并删除了包含命令链接的 标记。这解决了 commandink 上的点击两次问题。

标签: javascript ajax jsf xhtml


【解决方案1】:

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

所以,应该这样做

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

(假设 &lt;form id="contracts"&gt; 本身不在另一个 NamingContainer 父级中,再次,只需检查生成的 HTML 输出即可确定)

至于为什么需要点击两次命令链接,这很可能与JSF spec issue 790有关。解决方法是在render 中明确包含另一种形式。另见Ajax rendering of content which contains other form

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2018-06-03
    • 1970-01-01
    • 2019-09-04
    • 2021-06-13
    • 2020-09-29
    相关资源
    最近更新 更多