我有以下问题:http://emberjs.jsbin.com/goqera/13/,在这里,我打印出所选的选项ids。当选中的属性更改时,将在观察者中更新ids。
当您尝试它时,您将看到打印的it总是来自以前的状态,而不是当前的状态。活动计数是正确的,活动ids落后一个状态.
// this computed property is correct and reflects the current checked options state
checkedOptions: Ember.computed.filterBy('model', 'checked', true),
// this observer is always one state behind
observeCheckedListOptions: function() {
this.set('checkedOptionIds', this.get('checkedOptions').mapBy('id'));
}.observes('model.@each.checked').on('init')我认为观察者中的某些东西是错误的,因为计算的属性checkedOptions是正确的。我做错了什么?
发布于 2014-11-30 23:04:42
我不是运行回路专家,但我认为这是因为你观察到的是一个不同于你正在得到的属性。因此,要用当前代码描述这种行为:
model.@each.checked的更改,因此任何依赖计算的属性都需要更新,任何观察者都需要运行。使用run循环将此工作添加到队列中,有用于计算属性更新和观察者的单独队列。this.get('checkedOptions')时,您将得到值预更新(因为该工作发生在优先级较低的队列中)。因此,有了这些知识,您就有了一些解决问题的方法。undeletable的答案是好的,如果您只使用计算过的属性,那么您就不会被不同的队列捕获。另一种选择是观察您获得的属性,这样,您的观察者只会在属性更新之后才开火:
observeCheckedListOptions: function() {
this.set('checkedOptionIds', this.get('checkedOptions').mapBy('id'));
}.observes('checkedOptions.@each').on('init')但是,我最喜欢的解决方案必须是使用另一个计算属性宏:
checkedOptionIds: Ember.computed.mapBy('checkedOptions', 'id')但是,这样做有一个陷阱,它是一个实际的数组,而且(恼人的是)工具栏拒绝呈现它(我仍然不知道为什么),所以您需要在模板中也这样做:
{{#each id in checkedOptionIds }}
{{id}}
{{/each}}发布于 2014-11-30 21:40:19
不能确切说明原因是什么,但在您的例子中,我不明白为什么需要使用观察者来设置单个属性,而不是使其成为计算属性(请参见JSBin):
checkedOptionIds: function() {
return this.get('checkedOptions').mapBy('id');
}.property('checkedOptions.@each.checked')https://stackoverflow.com/questions/27217820
复制相似问题