我在我的一个应用程序中使用以下内容将函数传递给自定义控件:
1) 在自定义控件中添加一个属性,用于保存要在操作按钮中执行的函数。我将其称为“querySave”。属性类型必须为“javax.faces.el.MethodBinding”。编辑器必须为“Method Binding Editor”。
2) 以下是此示例中自定义控件中操作按钮背后的代码:
if (compositeData.querySave) if (!compositeData.querySave.call()) return;
currentDocument.save();
这段话的意思是:如果在属性“querySave”中定义了一个函数,则调用它。如果该函数返回false,则不保存文档。
第3步是定义一个SSJS函数,以执行您需要操作按钮执行的操作。通常我会将其放在SSJS库中,并确保XPage可以访问该函数。
第4步是在包含此控件的XPage中,使用我们在第1步中创建的属性编辑器(例如querySave),并输入您在第3步中创建的函数名称。重要提示:不要在输入函数名称时添加括号或参数-如果这样做,函数将在加载时执行而不是在单击操作按钮时执行。此外,请勿直接向编辑器添加任何代码,只需添加函数名称即可。在此编辑器中的任何代码也将在加载时执行。
感谢
Bill Hanson在Experts Exchange上的回答。
--
更新:
这是一个具有自定义属性的自定义控件的具体示例,其中调用了名为validateDocument的SSJS函数:
<xc:component_buttons>
<xc:this.validateFunctionName><![CDATA[#{javascript:validateDocument}]]></xc:this.validateFunctionName>
</xc:component_buttons>
这里是自定义控件中调用函数的按钮示例:
<xp:button id="submit" value="Save">
<xp:eventHandler event="onclick" submit="true" refreshMode="complete">
<xp:this.action>
<xp:actionGroup>
<xp:this.condition><![CDATA[#{javascript:
if (compositeData.validateFunctionName) {
compositeData.validateFunctionName.call();
}}]]>
</xp:this.condition>
<xp:save></xp:save>
</xp:actionGroup>
</xp:this.action>
</xp:eventHandler>
</xp:button>