Подтвердить что ты не робот

Доступ к вложенным базовым атрибутам модели из шаблона усов

У меня есть одна модель 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. Я не могу найти примеры того, как получить доступ к этим атрибутам связанных объектов.

Я ценю любую помощь! Спасибо!

4b9b3361

Ответ 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}}

Надеюсь, что это поможет.