跳至内容

WebObjects/Web 应用/开发/WO 组件/绑定同步

来自维基教科书,开放的书本,开放的世界

WebObjects 维基教科书被视为已弃用

[编辑 | 编辑源代码]

请查看 http://wiki.objectstyle.org/confluence/display/WO/Web+Applications-Development-WO+Component-Binding+Synchronization

当您创建 WOComponent 的子类时,默认配置是自动同步所有绑定。绑定同步是获取和设置父级和子级 .wod 文件绑定的过程,在请求-响应循环期间执行。虽然绑定同步非常方便,但唯一的缺点是您的绑定获取和设置方法可能会在请求-响应循环期间被多次调用(最多六次)。因此,您应该注意获取和设置方法内部潜在的性能问题。如果您希望避免潜在的性能问题,可以在您的组件中禁用自动绑定同步,只需覆盖 synchronizesVariablesWithBindings 方法以返回 false,如下例所示:

   public boolean synchronizesVariablesWithBindings() {
     return false;
   }

如果 synchronizesVariablesWithBindings 为 false,您将使用 valueForBinding(bindingName) 和 setValueForBinding(value, bindingName) 方法手动获取和设置绑定值。

WOComponentContent

[编辑 | 编辑源代码]

由于 WOComponentContent 的工作方式,绑定通常与您的直觉相反(通常会发生您的包装器将它的标题值推送到您的页面,而不是相反)。使您的模板包装器组件按预期的方式工作的一种方法是关闭自动绑定同步。

 public boolean synchronizesVariablesWithBindings() {
   return false;
 }
 public String pageTitle() {
   return (String)valueForBinding("pageTitle");
 }

Kieran Kelleher

[编辑 | 编辑源代码]

查看 WOComponent API 的 valueForBinding 和 setValueForBinding 方法。在您的子组件中,您可以定义 API(WOBuilder 中的拼图图标)。使用延迟初始化按需拉取绑定。子组件通常通过绑定从父级拉取并推送到父级。以下是一个简单的手动拉取和推送 'customer' 绑定的示例。

 public CTCustomer customer()
 {
   if (customer == null) {
     customer = (CTCustomer)valueForBinding("customer");
   }
   return customer;
 }
 
 public void setCustomer(CTCustomer newCustomer)
 {
   customer = newCustomer;
   setValueForBinding(customer,"customer");
 }

还可以查看 synchronizeVariablesWithBindings 以打开手动绑定同步(建议按需同步,而不是在 R-R 循环中同步 6 次左右)。

如果您在绑定访问器方法中使用延迟初始化,如上所述,您还应该使组件无状态。如果您不使组件无状态,您会发现您的组件在 WORepetition 中使用时可能会显示不正确的值。这种情况发生在 WORepetition 的列表通过组件操作更改并且返回 null 时。现有的嵌套组件将被重用,并且将显示原始列表中的值。

使组件无状态并覆盖它的 reset 方法,将所有实例变量设置为 null。这将使组件按预期的方式工作。

华夏公益教科书