Xpages-单击按钮调用bean方法

Xpages-单击按钮调用bean方法,xpages,xpages-ssjs,xpages-extlib,Xpages,Xpages Ssjs,Xpages Extlib,我使用绑定到视图范围bean的自定义控件在读取模式下显示了一个表单。我需要在这个CC上有一个选择器,以便用户可以选择其他文档。这些显示为链接(使用重复控件生成)。 我计划在视图范围bean中触发一个方法,以便在选择更改时保存该值 现在我被困在: 多值字段(与选择器一起使用)的onChange事件不会触发SSJS代码 我尝试创建一个按钮,在上面的字段更改时使用CSJS单击该按钮-这也不起作用 简而言之,SSJS代码没有被触发 这让我很不安,因为我创建了一个文件下载控件,其中添加了一个在bean中调

我使用绑定到视图范围bean的自定义控件在读取模式下显示了一个表单。我需要在这个CC上有一个选择器,以便用户可以选择其他文档。这些显示为链接(使用重复控件生成)。 我计划在视图范围bean中触发一个方法,以便在选择更改时保存该值

现在我被困在:

  • 多值字段(与选择器一起使用)的onChange事件不会触发SSJS代码
  • 我尝试创建一个按钮,在上面的字段更改时使用CSJS单击该按钮-这也不起作用
  • 简而言之,SSJS代码没有被触发

    这让我很不安,因为我创建了一个文件下载控件,其中添加了一个在bean中调用方法的移除按钮,它工作得很好

    我正在使用Mark Leusink的Debugtoolbar,无法显示简单消息或设置任何范围变量。这在onChange和onClick事件中发生!! 我在下面提供了我的CC代码。如果需要,可以将其放入绑定到视图范围bean的任何Xpage中

        <?xml version="1.0" encoding="UTF-8"?>
    <xp:view xmlns:xp="http://www.ibm.com/xsp/core" xmlns:xe="http://www.ibm.com/xsp/coreex">
        <xp:panel id="panel1">
            <xp:inputTextarea id="inputTextarea1" style="display:none" value="#{viewScope[compositeData.pickerDetails.beanName][compositeData.pickerDetails.saveToField]}"
                multipleSeparator=","
            >
                <xp:eventHandler event="onchange" submit="true" refreshMode="partial" refreshId="repeatLinks">
                    <xp:this.action><![CDATA[#{javascript://viewScope[compositeData.pickerDetails.beanName][compositeData.pickerDetails.saveToField]= getComponent("inputTextarea1").getValue();
    //viewScope.get(compositeData.pickerDetails.beanName).setValue(compositeData.pickerDetails.saveToField,getComponent("inputTextarea1").getValue());
    //viewScope[compositeData.pickerDetails.beanName].linkDocs(compositeData.pickerDetails.saveToField,getComponent("inputTextarea1").getValue());}]]></xp:this.action>
                    <xp:this.script><![CDATA[//console.log("Btn found : "+document.getElementById(getID("btnLinks")));
    document.getElementById(getID("btnLinks")).click();]]></xp:this.script>
                </xp:eventHandler>
            </xp:inputTextarea>
            <xe:valuePicker id="valuePicker1" listHeight="auto" listWidth="auto" dialogTitle="#{javascript:compositeData.pickerDetails.title}" for="inputTextarea1">
                <xe:this.dataProvider>
                    <xe:simpleValuePicker labelSeparator="|">
                        <xe:this.valueList><![CDATA[#{javascript:var cd = compositeData.pickerDetails;
    getPickerList(cd.viewName,cd.filter,cd.filterField);}]]></xe:this.valueList>
                    </xe:simpleValuePicker>
                </xe:this.dataProvider>
            </xe:valuePicker>
            <xp:repeat id="repeatLinks" rows="30" var="docLink">
                <xp:this.value><![CDATA[#{viewScope[compositeData.pickerDetails.beanName][compositeData.pickerDetails.saveToField]}]]></xp:this.value>
                <xp:text escape="false" id="computedField1">
                    <!-- Link is generated here -->
                </xp:text>
                <xp:br></xp:br>
            </xp:repeat>
    
            <xp:button value="Click Me" id="btnLinks" refreshId="repeatLinks" refreshMode="partial">
                <xp:this.onclick><![CDATA[#{javascript:viewScope[compositeData.pickerDetails.beanName].linkDocs(compositeData.pickerDetails.saveToField,getComponent("inputTextarea1").getValue());}]]></xp:this.onclick>
            </xp:button>
        </xp:panel>
    </xp:view>
    

    您提到这是一个自定义控件。最可能的原因是页面上其他地方的验证失败。您的按钮调用SSJS时不带
    exemode=“partial”
    execId
    。这意味着在部分刷新期间验证完整的XPage。您的refreshId不包含错误块,因此,如果存在验证错误,则无需向用户(和您!)发出任何警告

    在按钮上设置
    execMode=“partial”
    execId=“panel1”
    应该可以解决问题

    如果是这样的话,我建议将来在应用程序中添加一个PhaseListener,以便您可以轻松地输出要触发的阶段和/或始终确保刷新区域包含错误控件。

    如果删除样式“display:none”,代码是否会触发


    可能正在发生验证失败。如果为这些事件选择“未经验证的处理数据”,会发生什么情况?

    谢谢Paul,当我在“事件”选项卡中编写代码时,它不会被触发。正如您在上面的onClick中看到的,我已经在所有属性的事件下添加了内容。不确定这是我的设计师还是什么。然而,如果我像上面那样放置它,它会触发早期阶段,我不能再次触发它。如果在所有属性中单击编辑器,您会发现它显示客户端Javascript编辑器。因此,您输入的ssj是在初始呈现响应阶段计算的,将用于计算将作为客户端JavaScript运行的输出。将其移回“事件”选项卡,确保已将其置于“服务器”选项卡上,然后尝试查找验证错误。已尝试过。有没有办法确定是否触发了SSJS代码?我尝试设置范围变量/调试消息,但没有效果。我在onChange事件的onComplete上添加了CSJS,它会触发。但不是我的SSJS代码。我添加了错误控件,没有错误。我使用view.postScript方法在上面的代码中为panel1的OnClient Load事件添加了一条警报消息。它也不起作用。DebugToolbar中的信息消息也是如此!!PhaseListener是识别是否触发部分刷新以及处理哪些阶段的最佳方法。托尼·麦古金(Tony McGuckin)对此加了一句话。。。。代码2在faces配置中注册它,代码3是作为PhaseListener的Java类。嗨,John,显示字段只是显示从值选择器在字段中更新的值。它不会导致任何错误。