我使用标签小部件绑定了列表的选定项目。我还添加了一个转换器来转换我的数据。虽然绑定是unidrectionnal(http://www.qooxdoo.org/5.0.1/apiviewer/#qx.data.SingleValueBinding~bind),但转换器似乎被调用了两次。
这是code snippet。选择列表中的任何元素,然后查看浏览器的控制台。
Shoudln只被召唤一次?
我还在Gitter聊天中找到了这个相关的帖子。用户的问题已经解决,但它没有解释为什么转换器使用单向绑定被调用两次: https://gitter.im/qooxdoo/qooxdoo?at=579b01dc1d6bf8244e2b5f71
答案 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
事件,很可能会破坏现有应用程序并使现有用户的升级路径更加困难。请随时加入有关该问题的讨论,以讨论最佳前进方向。