【问题标题】:Cannot find component with identifier h:selectBooleanCheckbox outside p:datatable primefaces在 p:datatable primefaces 之外找不到标识符为 h:selectBooleanCheckbox 的组件
【发布时间】:2013-08-28 06:30:38
【问题描述】:

我的应用程序中有此代码 我想提交 h:selectBooleanCheckbox 值到服务器, h:selectBooleanCheckbox 在 p:tabView 内部和 p:dataTable 外部 我想提交 h:selectBooleanCheckbox 值来自 p:ajax 进程="scenarioTabViewId:isApprovedBooleanId_checkBox" scenarioTabViewId:isApprovedBooleanId_checkBox 这是由 firefox v23.0 创建的复选框 id 和scenarioTabViewId:budgetAnalysisDataTableId 这是数据表id 任何人都可以解释一下,我该怎么做? 这是 .xhtml 中的实际代码

<ui:composition template="/template/mastertemplate.xhtml">
  <ui:define name="content">
     <h:form styleClass="form" prependId="false">
       <p:panel id="analysisTheBudgetPenel" header="Analysis The Budget">
           <p:tabView id="scenarioTabViewId" style="width:850px">
              <p:tab title="Scenario One" id="scen">
                  <h:selectBooleanCheckbox id="isApprovedBooleanId_checkBox" value="#{budgetAnalysisAction.budgetScenarioHescoProposalBean.abc}" />
                  <p:scrollPanel style="width:800px; height:auto;">
                  <p:dataTable id="budgetAnalysisDataTableId" rowIndexVar="index" editable="true" resizableColumns="true" value="#{budgetAnalysisAction.budgetScenarioHescoProposalBean.budgetScenarioHescoProposalListBean}" var="budgetScenarioHescoProposalList">
                     <p:ajax event="rowEdit" process="#{scenarioTabViewId:isApprovedBooleanId_checkBox}" listener="#{budgetAnalysisAction.testAjax}" />
// some columns
// closing tags of above

提前致谢

【问题讨论】:

    标签: ajax jsf-2 primefaces datatable


    【解决方案1】:

    首先,删除&lt;h:form prependId="false"&gt;。它与ajax不兼容。不要忘记现在给表单一个固定的 ID。

    <h:form id="formId" styleClass="form">
    

    其次,process 属性在您的情况下是错误的,您使用的是 EL 表达式,其中组件的客户端 ID 作为 EL 范围内的变量。这没有任何意义。把它变成一个普通的字符串。

    可以在以下答案中找到引用正确客户端 ID 的规则:How to find out client ID of component for ajax update/render? Cannot find component with expression "foo" referenced from "bar"。应用它,它应该看起来像这样(注意: 前缀):

    process=":formId:scenarioTabViewId:isApprovedBooleanId_checkBox"
    

    另一种方法是将物理复选框组件绑定到视图,如下所示:

    <p:selectBooleanCheckbox binding="#{checkbox}" ... />
    

    然后在 UIComponent#getClientId() 的帮助下引用它的客户端 ID,就像这样(也在这里,注意 : 前缀):

    process=":#{checkbox.clientId}"
    

    【讨论】:

    • 对不起,我写错了这个过程="#{scenarioTabViewId:isApprovedBooleanId_checkBox}" 我的实际代码是 process="scenarioTabViewId:isApprovedBooleanId_checkBox",我为什么要删除
      这个?你能让我明白吗?
    • JSF 将无法通过这种方式找到正确的组件。 prependId="false" 未在 findComponent() 中考虑。 prependId="false" 只是客户端,即它只影响生成的 HTML 元素 ID。另请参阅链接答案的最后一段。 prependId="false" 应该只用于非常特定(和非 ajax)的用例。在现实世界的代码中,通常从来没有对它的有效需求。停止使用它。
    • 谢谢亲爱的你太棒了!!这个语句 (process=":formId:scenarioTabViewId:isApprovedBooleanId_checkBox") 对我有用.. 你能告诉我从哪里可以对 jsf 2 进行深入研究吗?
    • 我已经这样做了(prependId="false"),因为在我的应用程序中的某些地方,我编写了一个名为 getCountriesByIdsOnAjax() 的通用方法(由不同 xhtml 文件中的许多 froms 调用),它正在返回当我更改 countryselect 值时的国家名称我调用了 getCitiesByIdsOnAjax() 它返回城市名称(美国-> 纽约),
    • 继续上面当我更改 countryselect 我通过 getrequestparameter("country") 在服务器中获取该值如果我不写这个 (prependId="false") 然后 onChange countryselect 从许多 xhtmls (不同的形式来自不同xhtml 文件)我会根据请求获取值,例如“form1:countrySelect”“form2:CountrySelect”等等。
    猜你喜欢
    • 2012-11-10
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多