Emberjs更新/观察者/运行循环

Emberjs Updates/Observers/Run Loop

本文关键字:循环 运行 观察者 Emberjs 更新      更新时间:2023-09-26

我有一个控制器,它观察一个属性(数组),每次它改变时,在服务器上调用一个昂贵的函数,然后显示结果。

在初始控制器设置中(在路由中),我需要循环遍历数组并设置一些值-即

something.forEach(function(el) { myArrayProperty.set(el.id, true); });

这是通过forEach在每个循环上触发观测器。我如何循环通过forEach,更新所有元素,然后允许余烬观察者开火?

我试过scheduleOnceEmber.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