【问题标题】:selectBooleanCheckBox in datatable header not calling actionListener数据表标题中的 selectBooleanCheckBox 未调用 actionListener
【发布时间】:2012-12-30 00:16:15
【问题描述】:

我有一个包含三列的数据表,每列的标题中有一个复选框。当我选择一个复选框时,我必须更新其他 2 个复选框。这些列下的每一行都是一个带有验证器的输入框。当我提交表单时,我可以看到验证器正在执行,但我的 actionListener 没有被调用。也没有堆栈跟踪。请提出建议。

    <p:dataTable id="segmentRangeTable" var="rank"
    value="#{segmentSetup.ranks}">

    <p:column headerText="Segment Names">
        <p:outputPanel layout="block">
            <p:inputText id="segmentName" style="text-transform:uppercase"
                value="#{segmentSetup.userSegment.segmentNames[rank].name}"
                validator="#{segmentSetup.validateNames}" immediate="true" />
            <p:message for="segmentName" />
        </p:outputPanel>
    </p:column>

    <p:column>
        <f:facet name="header">
            <p:outputPanel layout="block">
                <p:outputLabel value="AUM" />
                <br />

                <p:outputPanel id="AUMcheckBox">
                    <p:selectBooleanCheckbox itemLabel="Default Rating" 
                        styleClass="defaultRating"
                        value="#{segmentSetup.defaultRating eq 'AUM' ? true : false}"
                        disabled="#{!segmentSetup.userSegmentTypesMap['AUM'].selected}" >
                        <p:ajax update=":tabView:clientSegmentationTabForm:segmentRangeTable:REREVcheckBox :tabView:clientSegmentationTabForm:segmentRangeTable:REVcheckBox :tabView:clientSegmentationTabForm:segmentRangeTable:AUMcheckBox" process="@this" immediate="true"
                            listener="#{segmentSetup.changeDefaultRating('AUM')}" />
                    </p:selectBooleanCheckbox>

                </p:outputPanel>

            </p:outputPanel>
        </f:facet>
        <p:inputText id="AUM" styleClass="AUM"
            value="#{segmentSetup.userSegmentTypesMap['AUM'].segmentValues[rank].rangeMinValue}"
            disabled="#{!segmentSetup.userSegmentTypesMap['AUM'].selected || (rank==fn:length(segmentSetup.ranks))}"
            validator="#{segmentSetup.validateRanges}" immediate="true" >
            <f:convertNumber maxFractionDigits="2" currencySymbol="$"
                type="currency" minFractionDigits="0" />
        </p:inputText>
        <p:message for="AUM" />
    </p:column>

    <p:column>
        <f:facet name="header">
            <p:outputPanel>
                <p:outputLabel value="GROSS REVENUE" />
                <br />
                <p:outputPanel id="REVcheckBox">
                    <p:selectBooleanCheckbox itemLabel="Default Rating" 
                        styleClass="defaultRating"
                        value="#{segmentSetup.defaultRating eq 'GRRVN' ? true : false}"
                        disabled="#{!segmentSetup.userSegmentTypesMap['GRRVN'].selected}">
                        <p:ajax update=":tabView:clientSegmentationTabForm:segmentRangeTable:REREVcheckBox :tabView:clientSegmentationTabForm:segmentRangeTable:REVcheckBox :tabView:clientSegmentationTabForm:segmentRangeTable:AUMcheckBox" immediate="true"
                            listener="#{segmentSetup.changeDefaultRating('GRRVN')}">
                        </p:ajax>
                    </p:selectBooleanCheckbox>
                </p:outputPanel>
            </p:outputPanel>
        </f:facet>
        <p:outputPanel>
            <p:inputText id="GRRVN" styleClass="GRRVN"
                value="#{segmentSetup.userSegmentTypesMap['GRRVN'].segmentValues[rank].rangeMinValue}"
                disabled="#{!segmentSetup.userSegmentTypesMap['GRRVN'].selected  || (rank==fn:length(segmentSetup.ranks)) }"
                validator="#{segmentSetup.validateRanges}" immediate="true" >
                <f:convertNumber maxFractionDigits="2" currencySymbol="$"
                    type="currency" />
            </p:inputText>
            <p:message for="GRRVN" />
        </p:outputPanel>
    </p:column>

    <p:column>
        <f:facet name="header">
            <p:outputPanel>
                <p:outputLabel value="REC REVENUE" />

                <br />
                <p:outputPanel id="REREVcheckBox">
                    <p:selectBooleanCheckbox itemLabel="Default Rating" 
                        styleClass="defaultRating"
                        value="#{segmentSetup.defaultRating eq 'RERVN' ? true : false}"
                        disabled="#{!segmentSetup.userSegmentTypesMap['RERVN'].selected}">
                        <p:ajax update=":tabView:clientSegmentationTabForm:segmentRangeTable:REREVcheckBox :tabView:clientSegmentationTabForm:segmentRangeTable:REVcheckBox :tabView:clientSegmentationTabForm:segmentRangeTable:AUMcheckBox" immediate="true"
                            listener="#{segmentSetup.changeDefaultRating('RERVN')}">
                        </p:ajax>
                    </p:selectBooleanCheckbox>
                </p:outputPanel>

            </p:outputPanel>
        </f:facet>

        <p:inputText id="RERVN" styleClass="RERVN"
            value="#{segmentSetup.userSegmentTypesMap['RERVN'].segmentValues[rank].rangeMinValue}"
            disabled="#{!segmentSetup.userSegmentTypesMap['RERVN'].selected  || (rank==fn:length(segmentSetup.ranks)) }"
            validator="#{segmentSetup.validateRanges}" >
            <f:convertNumber maxFractionDigits="2" minFractionDigits="0"
                currencySymbol="$" type="currency" />
        </p:inputText>

        <p:message for="RERVN" />
    </p:column>

</p:dataTable>

<p:outputPanel layout="block" styleClass="blx-align-rl">
    <p:commandButton id="saveButton" value="Save" process="@form"
        update="@form" actionListener="#{segmentSetup.save}" >
        <f:param name="VALIDATE" value="true" />
        </p:commandButton>
    <p:commandButton id="cancelButton" value="Cancel" update="@form"
        actionListener="#{segmentSetup.reset}" immediate="true" />
</p:outputPanel>

【问题讨论】:

  • 我认为您必须为您的 &lt;p:ajax/&gt; 指定一个 event 才能调用侦听器。试试onclickonchange
  • 我可以到达监听器。我的保存按钮上的动作监听器没有被调用。
  • 你能添加保存方法的代码(至少签名)吗?
  • actionListener的顺序尝试action
  • @Smith,是哪个?你的 selectCheckBox actionListener 还是你的 saveButton?您的问题和评论不匹配。如果您的生命周期处理无法通过验证阶段,原因很可能只是您的某个组件未通过验证。 actionListeners 会默默地失败,而不会将异常传播到顶部,因此不建议用于实际的业务逻辑。您可以切换到action 并观察问题,检查浏览器的控制台或输入&lt;h:messages/&gt; 以观察错误

标签: jsf-2 primefaces


【解决方案1】:

我在尝试使用选择状态来呈现或不呈现另一个面板时遇到了类似的问题。我基本上使用的是 JSF 2 和 Richfaces。 最后对我有用的是使用组件中的“onchange”并调用一个小 js,将我的面板属性更改为“无”和“重要”。

看起来差不多是这样的:

 <h:selectBooleanCheckbox
    id="idCheck"
    value="#{bean.hidePanel}"
    onchange="changePanelView()">
</h:selectBooleanCheckbox>

还有js:

    <script>
        function changePanelView() {
            if (document.getElementById('idForm:idCheck').checked) {
                document.getElementById('idPanel').style.setProperty('display', '', 'important');
            } else {
                document.getElementById('idPanel').style.setProperty(
'display','none', 'important');
            }
        }
    </script>

这个页面已经使用了一些 ajax 技巧,但是我从这种情况中删除了,因为它重新渲染了面板,覆盖了属性“display”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 2013-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多