Xpages - 单击按钮时调用bean方法

时间:2015-08-05 12:25:36

标签: xpages xpages-ssjs xpages-extlib

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

现在我被困住了:

  1. onChange事件的多值字段(与选择器一起使用)不会触发SSJS代码
  2. 我尝试创建一个按钮,我在上面的字段的onChange上使用CSJS点击 - 这也不起作用。
  3. 简而言之,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>
    

2 个答案:

答案 0 :(得分:1)

你提到这是一个自定义控件。最可能的原因是页面上其他地方的验证失败。您的按钮在没有execMode="partial"execId的情况下调用SSJS。这意味着在部分刷新期间验证完整的XPage。您的refreshId不包含错误块,因此如果存在验证错误,则无法提醒用户(以及您!)。

在按钮上设置execMode="partial"execId="panel1"可以解决问题。

如果是这种情况,将来我会建议在您的应用程序中添加PhaseListener,以便您可以轻松输出正在触发的阶段和/或始终确保refreshArea包含错误控制。

答案 1 :(得分:1)

如果删除样式“display:none;”那么代码会触发吗?

可能会发生验证失败。如果您为这些事件选择“未经验证的流程数据”会发生什么?