Доступ к атрибутам вложенной модели магистрали из шаблона усов - PullRequest
12 голосов
/ 04 июня 2011

У меня есть одна модель Backbone, атрибут которой является ссылкой на другую модель Backbone.Например, Person имеет ссылку на объект 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 });

Я не могу понять, как получить к нему доступ в моем шаблоне усов.Работа.Когда я смотрю на внутренности в Firebug, Address - это объект, но City - это атрибут в объекте атрибутов Address.Я не могу найти примеры того, как получить доступ к этим атрибутам связанных объектов.

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

Ответы [ 4 ]

8 голосов
/ 04 июня 2011

Я решил эту проблему следующим образом.

Я перешел с 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.

6 голосов
/ 09 июля 2011

Я справился с этим, создав другую версию 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(); });
  }
});
5 голосов
/ 04 июня 2011

Попробуйте использовать Handlebars , движок шаблонов на основе усов с поддержкой вложенных свойств.

Тогда это будет просто, как {{Address/City}}.

Если вы не хотите менять движок шаблонов, вы можете сгладить результаты объекта Address и передать их в качестве свойств непосредственно в Person.

3 голосов
/ 27 июля 2011

То же самое можно сказать и об усиках:

Привет

{{FirstName}}, you live in {{#Address}}{{City}} {{/Address}}

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

...