Получение backbone.js для запуска функции после создания Коллекции?

Я могу что-то здесь полностью упустить, но у меня есть следующее:

  • Модель, которая инкапсулирует «все» данные (все JSON загружаются из одной URL)
  • модель имеет одну (или несколько) коллекций, экземпляры которых она создает с данными, полученными при построении
  • некоторый код, который я хочу запустить в коллекции, когда данные инициализируются и загружаются

Мой вопрос о составленном Сборнике. Я мог бы сделать это за пределами Коллекции, но я бы предпочел инкапсулировать это (иначе какой смысл делать из него «класс» с инициализатором и т. Д.).

  1. Я думал, что могу поместить этот код в функцию initialize () , но она выполняется до того, как модель будет заполнена, поэтому у меня нет доступа к моделям, составляющим коллекцию ( this.models пуст).

  2. Тогда я подумал, что могу привязаться к событию, но после инициализации события не запускаются. Они были бы, если бы я загрузил коллекцию с помощью выборки из ее собственной конечной точки, но я этого не делаю, я инициализирую коллекцию из уже существующих данных.

Мой вопрос: Как получить код инициализации для запуска в Коллекции сразу после его инициализации данными (т.е. 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.
5
задан Joe 4 February 2012 в 00:05
поделиться