1

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

有没有办法做到这一点?

4

3 回答 3

4

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

但是,至少有两种方法可以实现您所追求的结果:

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

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

例如:

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

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

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

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

于 2012-04-09T22:25:13.253 回答
0

Tim 传入对象的解决方案是一个很好的解决方案。

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

于 2012-04-10T08:57:41.517 回答
0

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

于 2012-04-11T06:53:00.777 回答