首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >观察者总是迟到一个州

观察者总是迟到一个州
EN

Stack Overflow用户
提问于 2014-11-30 20:22:13
回答 2查看 90关注 0票数 0

我有以下问题:http://emberjs.jsbin.com/goqera/13/,在这里,我打印出所选的选项ids。当选中的属性更改时,将在观察者中更新ids。

当您尝试它时,您将看到打印的it总是来自以前的状态,而不是当前的状态。活动计数是正确的,活动ids落后一个状态.

代码语言:javascript
复制
// 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是正确的。我做错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-30 23:04:42

我不是运行回路专家,但我认为这是因为你观察到的是一个不同于你正在得到的属性。因此,要用当前代码描述这种行为:

  1. 选中一个框,这是对model.@each.checked的更改,因此任何依赖计算的属性都需要更新,任何观察者都需要运行。使用run循环将此工作添加到队列中,有用于计算属性更新和观察者的单独队列。
  2. 首先,运行观察者队列-这将运行您的观察者,当您执行this.get('checkedOptions')时,您将得到值预更新(因为该工作发生在优先级较低的队列中)。
  3. 将运行计算的属性队列,这对您根本没有帮助。

因此,有了这些知识,您就有了一些解决问题的方法。undeletable的答案是好的,如果您只使用计算过的属性,那么您就不会被不同的队列捕获。另一种选择是观察您获得的属性,这样,您的观察者只会在属性更新之后才开火:

代码语言:javascript
复制
observeCheckedListOptions: function() {    
    this.set('checkedOptionIds', this.get('checkedOptions').mapBy('id'));
}.observes('checkedOptions.@each').on('init')

但是,我最喜欢的解决方案必须是使用另一个计算属性宏:

代码语言:javascript
复制
checkedOptionIds: Ember.computed.mapBy('checkedOptions', 'id')

但是,这样做有一个陷阱,它是一个实际的数组,而且(恼人的是)工具栏拒绝呈现它(我仍然不知道为什么),所以您需要在模板中也这样做:

代码语言:javascript
复制
{{#each id in checkedOptionIds }}
    {{id}}
{{/each}}
票数 2
EN

Stack Overflow用户

发布于 2014-11-30 21:40:19

不能确切说明原因是什么,但在您的例子中,我不明白为什么需要使用观察者来设置单个属性,而不是使其成为计算属性(请参见JSBin):

代码语言:javascript
复制
checkedOptionIds: function() {    
  return this.get('checkedOptions').mapBy('id');
}.property('checkedOptions.@each.checked')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27217820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档