Javascript Ember.js-view';s型观测器发射两次
我想在视图绑定到的模型发生更改时运行一些视图代码 我的视图在控制器模型上有一个观察者,如下所示:Javascript Ember.js-view';s型观测器发射两次,javascript,ember.js,Javascript,Ember.js,我想在视图绑定到的模型发生更改时运行一些视图代码 我的视图在控制器模型上有一个观察者,如下所示: App.SomeView = Em.View.extend modelDidChange: (()-> # do stuff ).observes('controller.model') 当模型更改时,modeldichange被调用两次 为什么呢 有没有更好/不同的方法来实现我在这里的目标 使用Ember 1.3.0。是否确定视图需要知道模型何时更改?视图的模板从控制器获取
App.SomeView = Em.View.extend
modelDidChange: (()->
# do stuff
).observes('controller.model')
当模型更改时,modeldichange
被调用两次
为什么呢
有没有更好/不同的方法来实现我在这里的目标
使用Ember 1.3.0。是否确定视图需要知道模型何时更改?视图的模板从控制器获取其属性,当属性更改时应自动更新。如果可以的话,你当然想避开任何观察者
但我对您的用例了解不多,所以假设这是必要的,我会尝试一个。很可能模型没有更改两次,事件只触发了两次。Ember在用户钩子之间有很多操作,因此模型可能只设置了两次相同的值。使用debouncer只调用您的方法一次。因为您在浏览器中进行了更改而第一次触发该方法,并且该更改将发送到Ember数据存储,从而触发observer回调。然后,商店向后端发出
update
请求,后端会以更新的模型做出响应,当商店收到更新的模型时,它会再次触发观察者回调。是的,这是一个奇怪的用例。我需要在模型更改时卸载/加载swf(不问)。现在正在签出去Bouncing…didInsertElement
事件的文档说明它在视图重新渲染后激发。每次模型更改时都可能重新渲染视图。如果是这样,那将是您的理想场景(以及willdestoryement
事件)。也许可以尝试运行一个快速测试,看看更改模型是否会重新渲染视图。不幸的是,不会。didInsertElement只触发一次。我的视图在应用程序中是永久可见的,所以我猜重新渲染不适用于此处我猜它触发两次,因为在某个点上模型为空?然后新的模型就建立了,我不知道这个过程是怎么完成的。因此,我建议在观测者中添加一个Ember.run.one(这个函数(){}),这样观测者在当前的Ember循环中只触发一次。Ember.run.one和Ember.run.debounce都触发两次。似乎暗示这两个事件是单独的余烬运行循环的一部分。如果您找到问题的解决方案,请执行以下操作。我也有同样的问题。谢谢你的帮助
Ember.beginPropertyChanges();
# model updates
Ember.endPropertyChanges();