Анализ данных в Backbone.js

У меня есть несколько базовых моделей, у которых есть несколько вложенных подмоделей. Мое решение выглядит так:

Models.Base = Backbone.Model.extend ({
 relatedModels: {},

 /**
 * Parses data sent according to the list of related models.
 *
 * @since Version 1
 * @param {Object} response Response
 * @return {Object} Parsed data
 */
 parse: function (response) {
 var key,
 embeddedClass,
 embeddedData;

 for (key in this.relatedModels) {
 embeddedClass = this.relatedModels[key];
 embeddedData = response[key];
 response[key] = new embeddedClass (embeddedData, { parse: true });
 }

 return response;
 }
});

(используя материал, почерпнутый из этой публикации - Вложенные модели в Backbone.js, как подойти)

Это прекрасно работает, пока я получаю материал с сервера:

Models.Individual = Models.Base.extend({
 idAttribute: "idInd",
 urlRoot: "data/individuals/save",

 relatedModels: {
 details: Collections.DetailList,
 relationships: Collections.RelationshipList
 }
});

... но когда я пытаюсь инициализировать модель из простого бита JSON, например, если бы я сделал это:

var Ind = new Models.Individual ({
 idInd: 1,
 name: "Bob Holness",
 details: [
 { option: "I'd like an 'e' please, bob" },
 { option: "Can I have a 'p' please, bob" }
 ],
 relationships: []
});

... похоже, он не хочет разбирать "детали". Я бы предположил, что это связано с тем, что он не запускает функцию Parse, но в любом случае - как я могу заставить ее анализировать данные в обоих случаях?

1 ответ

Самый простой способ сделать это - передать parse: true для конструктора, например:

var Ind = new Models.Individual ({
 idInd: 1,
 ...
}, { parse: true });

Если вы это сделаете, вы можете переопределить конструктор в базовом классе и выполнить его parse: true каждый раз, когда вы создаете экземпляр новой модели:

Models.Base = Backbone.Model.extend({
 constructor: function(attributes, options) {
 var opts = $.extend({}, options || {});
 if (_.isUndefined(opts.parse)) {
 opts.parse = true;
 }
 Backbone.Model.call(this, attributes, opts);
 },

 ...
});

licensed under cc by-sa 3.0 with attribution.