javascript - 在构造一个集合后让 backbone.js 运行一个函数?

标签 javascript backbone.js backbone-events

我可能在这里完全遗漏了一些东西,但我有以下内容:

  • 封装“所有”数据的模型(从一个 URL 加载的所有 JSON)
  • 该模型有一个(或多个)集合,它正在使用构建时获得的数据进行实例化
  • 一些我想在数据初始化和加载时在集合上运行的代码

我的问题是关于组合集合的。我可以在 Collection 的范围之外执行此操作,但我宁愿将其封装(否则将其作为带有初始化程序等的“类”有什么意义)。

  1. 我想我可以将该代码放在 initialize() 函数中,但是它在填充模型之前运行,所以我无法访问构成集合(this.models 为空)。

  2. 然后我想我可以绑定(bind)一个事件,但是初始化后没有触发任何事件。如果我使用 fetch 从它自己的端点加载集合,它们会是这样,但我没有这样做,我是从预先存在的数据初始化集合。

我的问题:如何让初始化代码在用数据初始化后立即在集合上运行(即 this.models 不为空)。

是否可以在不涉及“外部”代码的情况下执行此操作?

好的,这是演示代码,也许这会更好地解释事情。

var Everything = Backbone.Model.extend({
    url: "/static/data/mydata.json",
    parse: function(data)
    {
        this.set("things", new Things(data.things, {controller: this}));
    }
});

var Thing = Backbone.Model.extend({
});

var Things = Backbone.Collection.extend({
  model: Thing,
  initialize: function(data, options)
  {
      // HERE I want access to this.models. 
      // Unfortunately it has not yet been populated.
      console.log("initialize");
      console.log(this.models);
      // result: []

      // And this event never gets triggered either!
      this.on("all", function(eventType)
      {
          console.log("Some kind of event happend!", eventType);
      });
  }
});

var everything = new Everything();
everything.fetch();

// Some manual poking to prove that the demo code above works:

// Run after everything has happened, to prove collection does get created with data
setTimeout(function(){console.log("outside data", everything.get("things").models);}, 1000);
// This has the expected result, prints a load of models.


// Prove that the event hander works.
setTimeout(function(){console.log("outside trigger", everything.get("things").trigger("change"));}, 1000);
// This triggers the event callback.

最佳答案

不幸的是,只有在首先正确初始化之后,集合才会设置数据,并且使用 silent: true 标志重置模型,这意味着事件不会触发。

如果你真的想使用它,你可以通过使用 setTimeout(..., 0) 或下划线 defer 延迟执行你想做的任何事情到下一个浏览器事件循环来稍微欺骗它。方法。

initialize: function(data, options) {

     _.defer(_.bind(this.doSomething, this));
},

doSomething: function() {

    // now the models are going to be available
}

关于javascript - 在构造一个集合后让 backbone.js 运行一个函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9136815/

相关文章:

javascript - 同一个异步函数中的多个回调?

javascript - 在 Backbone.js 中使用什么来代替 "this"?

javascript - 为给定的 object_id 获取和呈现集合的最佳方式

backbone.js - 如何在主干文章中添加调整大小事件?

javascript - JavaScript 方式避免重复

Javascript - 无法读取未定义的属性

javascript - D3.js 表附加相同的数据值

javascript - Backbone 中自定义事件的优势是什么?

javascript - 如何从 Backbone.listenTo 中查找触发事件?

javascript - 如何检查数组中是否存在特定的对象元素(而不是属性)?