Emberjs更新/观察者/运行循环
Emberjs Updates/Observers/Run Loop
我有一个控制器,它观察一个属性(数组),每次它改变时,在服务器上调用一个昂贵的函数,然后显示结果。
在初始控制器设置中(在路由中),我需要循环遍历数组并设置一些值-即
something.forEach(function(el) { myArrayProperty.set(el.id, true); });
这是通过forEach
在每个循环上触发观测器。我如何循环通过forEach
,更新所有元素,然后允许余烬观察者开火?
我试过scheduleOnce
和Ember.run(function() {..})
,但我似乎不能让它工作。
谢谢!
解决这个问题的一种方法是限制或取消观察数组的昂贵函数。
看到Ember.run.debounce
。你现在有这个了:
App.MyController = Ember.ArrayController.extend({
myExpensiveObserver: function() {
/* some expensive computations */
}.observes('content.@each.id'),
});
…然后改成这个:
App.MyController = Ember.ArrayController.extend({
myExpensiveObserver: function() {
Ember.run.debounce(this, this.myExpensiveObserverImpl, 300);
}.observes('content.@each.id'),
myExpensiveObserverImpl: function() {
/* some expensive computations */
},
});
(将300
替换为重新计算所需的最小间隔)
有一个微妙的区别Ember.run.debounceEmber.run.throttle,你可能更喜欢其中一个。但是,从你的描述来看,听起来两个都符合要求。
正如@kingpin2k所指出的,要小心传递给debounce或throttle的函数。它不能是匿名的,因为Ember将无法确定每次调用它时它们是否确实相同。
bguiz完全正确,要么限制它,要么抨击它。Throttling将允许它每隔x毫秒运行一次,而debounce将阻止它运行,直到它在x毫秒内没有运行。在另一个答案中遗漏的一个细微差别是Ember通过比较传入函数来跟踪debounce/throttle的方式。因此,每次传入一个匿名函数将继续触发,而不需要节流/退包。
App.MyController = Ember.ArrayController.extend({
myExpensiveObserver: function() {
Ember.run.debounce(this, this.realWorker, 300);
}.observes('content.@each.id'),
realWorker: function(){
console.log("I'm working");
},
myExpensiveObserverThrottle: function() {
Ember.run.throttle(this, this.realWorkerThrottle, 300);
}.observes('content.@each.id'),
realWorkerThrottle: function(){
console.log("I'm working");
}
});
示例:http://emberjs.jsbin.com/cixawagi/1/edit
- Bxslider预加载程序在没有图像的情况下以无限循环运行
- 有没有任何方法可以使这个名称生成循环运行最短的秒数
- 对于循环运行一次或在函数完成之前运行一次
- 希望Javascript无限循环运行
- 每次 while 循环运行时调用 javascript,以从数据库中给出一个唯一的时间
- Javascript循环运行异常
- KineticJS afterFrame没有't循环运行
- 循环运行顺序错误的Javascript
- 不明白为什么循环运行两次
- Javascript:.In循环运行的次数多于预期
- 通过For循环运行Javascript数组
- 基于PHP的循环运行javascript
- 从for循环返回,但保持循环运行
- 当我通过循环运行返回的元素集合时,JavaScript正在复制文档get方法返回的元素
- 为什么我的循环运行两次
- 每次while循环运行时调用javascript,给出一个唯一的波形
- 对于循环运行一次,2/3的方式(javascript)
- setInterval即使在javascript的clearInterval之后也会为一些循环运行
- 是否可以将for循环运行到.然后使用Protractor
- 如何强制Angular 1.x Digest循环运行3次