Доступ к вложенным базовым атрибутам модели из шаблона усов
У меня есть одна модель Backbone, у которой есть атрибут, который является ссылкой на другую модель Backbone. Например, у Человека есть ссылка на объект Address.
Person
FirstName
LastName
Address
Street
City
State
Zip
Это классы, которые расширяют модель Backbone. Итак, тогда, если я построю объект вроде следующего...
var address = new Address({ Street: "123 Main", City: "Austin" });
var person = new Person({ FirstName: "John", Address: address });
Я не могу понять, как получить доступ к нему в моем шаблоне Mustache.
Hi {{FirstName}}, you live in {{Address.City}}.
Очевидно, не работает. Когда я смотрю на внутренности в Firebug, Address является объектом, но City является атрибутом в объекте атрибутов Address. Я не могу найти примеры того, как получить доступ к этим атрибутам связанных объектов.
Я ценю любую помощь! Спасибо!
Ответы
Ответ 1
Попробуйте использовать Handlebars, механизм шаблонов на основе Mustache с поддержкой вложенных свойств.
Тогда это будет так же просто, как {{Address/City}}
.
Если вы не хотите менять свой шаблонный движок, вы можете сгладить результаты из объекта Address
и передать их как свойства непосредственно на Person
.
Ответ 2
Я решил решить эту проблему следующим образом.
Я переключился с Mustache.js на Handlebars.js для механизма шаблонов. Это позволило мне использовать выражения на основе пути для доступа к вложенным или связанным объектам и их атрибутам.
Hi {{FirstName}}. You live in {{Address.City}}.
Но мне также пришлось изменить способ передачи объекта JSON в шаблон. Я использовал метод toJSON, который является частью класса Backbone.Model. Но это не привело к правильной генерации JSON для соответствующего адреса (для работы шаблона). Он похоронил атрибуты адреса в члене под названием "атрибуты". Итак, вместо этого я закончил это...
var jsonForTemplate = JSON.parse(JSON.stringify(person));
Это дало мне "сырую" версию объектов и связанных с ними объектов, к которым шаблон мог получить доступ, используя синтаксис, показанный выше. JSON.parse и JSON.stringify являются частью json2.js.
Ответ 3
Я обработал это, создав еще одну версию toJSON, называемую deepToJSON, которая рекурсивно пересекает вложенные модели и коллекции. Возвращаемое значение этой функции затем можно передать в шаблон handlebars.js.
Вот код:
_.extend(Backbone.Model.prototype, {
// Version of toJSON that traverses nested models
deepToJSON: function() {
var obj = this.toJSON();
_.each(_.keys(obj), function(key) {
if (_.isFunction(obj[key].deepToJSON)) {
obj[key] = obj[key].deepToJSON();
}
});
return obj;
}
});
_.extend(Backbone.Collection.prototype, {
// Version of toJSON that traverses nested models
deepToJSON: function() {
return this.map(function(model){ return model.deepToJSON(); });
}
});
Ответ 4
Путь к тому же в Усы должно быть следующим:
Hi
{{FirstName}}, you live in {{#Address}}{{City}} {{/Address}}
Надеюсь, что это поможет.