通过自定义控件属性或自定义控件的自定义事件传递功能?

Bru*_*ski 4 xpages

这就是我想要做的.我有一个带按钮的自定义控件.如果我将它放在页面上,我希望最终用户程序员定义按下按钮时会发生什么.

我有三个关于如何实现这一点的想法,但不知道它们是否可能当然不知道如何做到这一点.

  1. 通过自定义属性传递函数.该按钮将该自定义属性称为函数.这可能吗?如果是这样,我该怎么做?我尝试过,但它似乎没有用.

    compositeData.ssjs_clickOK("Hello World");

  2. 为自定义控件定义自定义事件.这可能吗?怎么做呢

  3. 让按钮调用一个需要由用户程序员定义的唯一函数名.看起来有点乱,但它可能会奏效.我的按钮代码如何查看函数是否已定义?if(MySpecialFunction!= null)是否有效?

Per*_*ten 5

我在我的一个应用程序中使用以下内容将函数传递给自定义控件:

1)在自定义控件中,添加一个属性,该属性将保存要在我们的操作按钮中执行的功能.我称之为'querySave'.属性类型必须是'javax.faces.el.MethodBinding'.编辑器必须是"方法绑定编辑器".

2).以下是此示例的自定义控件中操作按钮背后的代码:

if (compositeData.querySave) if (!compositeData.querySave.call()) return;
currentDocument.save();
Run Code Online (Sandbox Code Playgroud)

这说:如果属性'querySave'中定义了一个函数,请调用它.如果函数返回false,请不要保存文档.

3)定义一个SSJS函数,它可以执行操作按钮所需的操作.我通常把我放在一个SSJS库中.确保XPage可以访问该功能.

4)在包含此控件的XPage中,使用我们在步骤1中创建的属性的编辑器(本例中为querySave)并输入在步骤3中创建的函数的名称.重要信息:不要添加括号或参数当您输入功能名称时 - 如果这样做,该功能将在加载时执行,而不是在您单击操作按钮时执行.另外,不要直接向编辑器添加任何代码,只需添加函数名称.此编辑器中的任何代码也将在加载时执行.

感谢Bill Hanson对专家交流的回答.

-

更新:

以下是具有自定义属性的自定义属性的具体示例,其中所讨论的SSJS函数称为validateDocument:

<xc:component_buttons>
    <xc:this.validateFunctionName><![CDATA[#{javascript:validateDocument}]]></xc:this.validateFunctionName>
</xc:component_buttons>
Run Code Online (Sandbox Code Playgroud)

以下是调用该函数的自定义控件中的按钮示例:

<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>
Run Code Online (Sandbox Code Playgroud)