【问题标题】:Is there any way to wait to invoke callback until multiple backbone collection have synced?有什么方法可以等待调用回调,直到多个主干集合同步?
【发布时间】:2013-04-08 15:21:12
【问题描述】:

如果 collectionA 和 collectionB 都触发了“同步”事件,我想运行 view.render()。 像这样。

collectionA = new CollectionA();
collectionB = new CollectionB();

view.listenTo([collectionA, collectionB], 'sync', view.render);

collectionA.fetch(); // do not call view.render yet.
collectionB.fetch(): // call view.render after fetch.

我知道有一种方法可以像这个答案一样使用 $.when() 或 _.after() 。 How to synchronize multiple Backbone.js fetches?

但我认为这些都不是事件驱动的方式。 Backbone.js 上有没有事件驱动的方式?

【问题讨论】:

    标签: backbone.js collections


    【解决方案1】:

    您可以结合使用下划线的after 方法仅在回调被多次调用时执行回调,并使用Backbone.Events.once 确保在其中一个集合触发时不会过早触发处理程序两个sync 事件,而不是每个事件一个:

    var callback = _.after(2, view.render);
    collectionA.once('sync', callback, view);
    collectionB.once('sync', callback, view);
    

    或者你可以将逻辑包装到一个实用函数中,这样你就可以将它与可变数量的事件源一起使用:

    function onceAll(eventSources, eventName, handler, context) {
      handler = _.after(eventSources.length, handler);
      context = context || this;
      _.each(eventSources, function(source) {
          source.once(eventName, handler, context);
      });
    }
    

    用法:

    onceAll([collectionA, collectionB], 'sync', view.render, view);
    

    /未经测试的代码示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-09
      • 1970-01-01
      • 2016-02-24
      • 2011-10-05
      • 2021-07-20
      • 2023-02-10
      • 2021-05-11
      • 1970-01-01
      相关资源
      最近更新 更多