【问题标题】:Emberjs Updates/Observers/Run LoopEmberjs 更新/观察者/运行循环
【发布时间】:2014-06-18 12:42:18
【问题描述】:

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

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

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

这是在通过forEach 的每个循环上触发观察者。如何遍历forEach,更新所有元素,然后然后允许 Ember 观察者触发?

我已经尝试过scheduleOnceEmber.run(function() {..}),但我似乎无法让它发挥作用。

谢谢!

【问题讨论】:

    标签: javascript ember.js


    【解决方案1】:

    解决此问题的一种方法是限制或去抖动观察数组的昂贵函数。

    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 所指出的,小心你传入的去抖动或节流函数。 它不能是匿名的,因为 Ember 无法在每次调用时确定它们是否确实相同。

    【讨论】:

    • 谢谢。我试过了,它完全按照我的希望工作!我在想可能有 Ember.PAUSE_ALL_THE_THINGS!Ember.RESTART_ALL_THE_THINGS! 功能,但这很好用。
    • bguiz,请你修复你的 debounce 调用,然后我很乐意支持这个。
    • @kingpin2k 你说得对,感谢您指出这一点。固定。
    【解决方案2】:

    bguiz 是完全正确的,限制或去抖动它。节流将允许它每 x 毫秒运行一次,而 debounce 将阻止它运行,直到它没有运行 x 毫秒。另一个答案中遗漏的一个细微差别是 Ember 通过比较传入的函数来跟踪去抖动/节流的方式。因此,每次传入一个匿名函数只会继续触发而不会受到限制/去抖动。

    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

    【讨论】:

    • 感谢您的澄清!我接受了另一个答案,但这些信息非常有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 2017-11-06
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多