转换器使用列表控制器调用两次

时间:2016-12-16 16:03:22

标签: qooxdoo

我使用标签小部件绑定了列表的选定项目。我还添加了一个转换器来转换我的数据。虽然绑定是unidrectionnal(http://www.qooxdoo.org/5.0.1/apiviewer/#qx.data.SingleValueBinding~bind),但转换器似乎被调用了两次。

这是code snippet。选择列表中的任何元素,然后查看浏览器的控制台。

Shoudln只被召唤一次?

我还在Gitter聊天中找到了这个相关的帖子。用户的问题已经解决,但它没有解释为什么转换器使用单向绑定被调用两次: https://gitter.im/qooxdoo/qooxdoo?at=579b01dc1d6bf8244e2b5f71

1 个答案:

答案 0 :(得分:1)

这是一些非常古老的代码的副作用,这可能是一个错误但很可能是为了兼容性而创建的(我们在这里讨论pre v1.x代码)和易用性; qx.data.controller.List将触发另一个" changeSelection"选择更改时的事件。这听起来很自然,直到您认为selection属性是一个对象,因此属性 List.selection根本没有变化 - 而是内容 selection数组对象正在发生变化。

在您的示例中,绑定正在侦听' selection [0]',这意味着它必须侦听对List.selection的更改以及对数组内容的更改在List.selection。因为有额外的变化选择'由qx.controller.List触发,这会导致对转换器的额外调用。

在许多情况下,它的净效果被抑制而不被注意到,至少部分是因为与其他属性的绑定将检测到该值已经设置,因此不会发射两次;这里有一个替代code snippet,它监听Label.value属性的更改,在控制台中你可以看到,当转换器被触发两次时,Label.value属性只被触发一次。

我同意这是一个错误; I've filed it as an issue here但问题是因为这是已建立的行为,如果我们停止触发changeSelection事件,很可能会破坏现有应用程序并使现有用户的升级路径更加困难。请随时加入有关该问题的讨论,以讨论最佳前进方向。