定制控制自定义方法?

时间:2012-04-09 13:59:03

标签: xpages

我一直在充分利用自定义控件的自定义属性。有自定义方法吗?说我想在CC中发生一些事情。一个很好的例子是对话框扩展的show方法。如果我有一个内置扩展对话框的cc,我希望我的自定义控件有一个Show方法,它将最终用户程序员与扩展页Shoe方法隔离开来。

有没有这样做?

3 个答案:

答案 0 :(得分:4)

在运行时,所有自定义控件元素都成为UIIncludeComposite类的实例;因此,有许多内置方法可以针对任何给定的控件实例调用,但是没有办法指定自定义方法,而不是自定义属性。

但是,至少有两种方法可以达到你想要的结果:

  1. 将自定义控件转换为组件(this NotesIn9 episode描述了此过程的最简单方法)。一旦您将Designer生成的类迁移到每次构建NSF时都不会被覆盖的类,您可以添加自定义方法,而不必担心下一个构建会再次擦除它们。由于Custom Controls基本上只是IBM对“复合组件”的JSF 2.0概念的实现,因此您还可以从头创建一个与现有自定义控件具有相同行为但也支持自定义行为的组件。请注意,任何一种方法都不一定要求您创建OSGi库...您可以直接在NSF中定义这些组件;如果你想在多个NSF中重复使用它们而不必将各种文件复制到每个文件库,你只需要将它们推送到库中。

  2. 在控件的自定义属性中,包含一个接受API对象的属性。换句话说,您可以创建支持您希望定义的自定义方法的任何对象(例如,Java类或SSJS对象),并将对象传递给控件。然后,您可以通过CC的属性映射获取对象的句柄来调用这些方法。

  3. 例如:

    <myCC id="myCustomControl" API="#{someObject}" />
    

    假设#{someObject}解析为包含show()方法,您可以通过获取已传递给控件的实例的句柄来调用该方法:

    var cc = getComponent("myCustomControl");
    var ccProperties = cc.getPropertyMap();
    var ccAPI = ccProperties.get("API");
    ccAPI.show(cc);
    

    在上面的例子中,我将实际的自定义控件传递给show()方法,因为对象本身不知道传递给它的自定义控件。因此,如果该方法需要获取其子项的句柄以切换其呈现的属性,那么它需要一些其他方法来确定其上下文。

答案 1 :(得分:0)

蒂姆的传递对象的解决方案是一个很好的解决方案。

只是突然出现在我脑海中的东西,很容易使一个属性类似于控件上的渲染属性。传递一个值并在自定义控件内部根据其值执行某些操作,即。如果是真显示对话框,否则隐藏,在XPage运行时修改此值并部分刷新控件,逻辑将由此重新运行,控件将显示等。

答案 2 :(得分:0)

另一种解决方案可能是在自定义控件中包含一个JavaScript库,提供函数(您的自定义控件方法),您必须传入自定义控件实例的ID。