Binded变量未及时同步

时间:2013-11-20 01:40:45

标签: ember.js coffeescript

怎么可能,绑定有延迟?

App.SomeRoute = Ember.Route.extend
   actions:
      someAction: ->
          console.log @controllerFor('some').get('foo')
          Ember.run.later (=> console.log @controllerFor('some').get('foo')), 10

App.SomeController = Ember.ObjectController.extend()

App.OtherController = Ember.ObjectController.extend
    needs: ['some']
    fooBinding: 'controllers.some.foo'

    action:
        changeIt: ->
             @set('foo', 'bar')
             @send('someAction')

如果引发了动作changeIt(例如从视图中),控制台输出将为undefined,但稍微延迟后它将为bar

我做错了什么?

1 个答案:

答案 0 :(得分:2)

这是预期的行为,当您更改绑定属性时,不会立即执行同步,只是计划并稍后调用。

这很重要,因为如果我们有fooBinding: 'controllers.some.foo'。无论foo被更改多少次,controllers.some.foo属性只需要使用最终结果更新一次。有了这个,我们就可以避免触发未经观察的观察者,并节省处理。

您可以使用Ember.run.sync()强制计划的同步队列使用以下代码进行刷新:

App.SomeRoute = Ember.Route.extend
   actions:
      someAction: ->
          Ember.run.sync()
          # now you can see the updated value
          console.log @controllerFor('some').get('foo')              

App.SomeController = Ember.ObjectController.extend()

App.OtherController = Ember.ObjectController.extend
    needs: ['some']
    fooBinding: 'controllers.some.foo'

    action:
        changeIt: ->
             @set('foo', 'bar')
             @send('someAction')

请记住,这只是一个示例,因为您可以看到更新后的值。不建议使用Ember.run.sync()