Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Ember.js-view';s型观测器发射两次_Javascript_Ember.js - Fatal编程技术网

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();