从胡子模板访问嵌套的骨干模型属性

时间:2011-06-04 01:27:47

标签: backbone.js mustache model-associations

我有一个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 });

我似乎无法弄清楚如何在我的Mustache模板中访问它。

Hi {{FirstName}}, you live in {{Address.City}}.

显然不起作用。当我查看Firebug中的内部时,Address是一个对象,但City是Address的属性对象中的一个属性。我找不到任何关于如何访问相关对象的属性的示例。

我感谢任何帮助!谢谢!

4 个答案:

答案 0 :(得分:8)

我最终用以下方法解决了这个问题。

我从Mustache.js切换到Handlebars.js作为模板引擎。这允许我使用基于路径的表达式来访问嵌套或关联的对象及其属性。

Hi {{FirstName}}. You live in {{Address.City}}.

但是,我还必须改变将JSON对象传递给模板的方式。我使用的是toJSON方法,它是Backbone.Model类的一部分。但是,这并没有正确地为关联的地址生成JSON(用于模板工作。)它将地址属性隐藏在标题为“attributes”的成员中。所以,相反,我最终做到了这一点......

var jsonForTemplate = JSON.parse(JSON.stringify(person));

这给了我一个对象的“原始”版本及其相关对象,模板可以使用上面显示的语法访问它们。 JSON.parse和JSON.stringify都是json2.js的一部分。

答案 1 :(得分:6)

我通过制作另一个名为deepToJSON的toJSON版本来处理这个问题,该版本以递归方式遍历嵌套模型和集合。然后可以将该函数的返回值传递给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(); });
  }
});

答案 2 :(得分:5)

尝试使用Handlebars,一个基于Mustache的模板引擎,支持嵌套属性。

然后就像{{Address/City}}一样简单。

如果您不想更改模板引擎,可以展平Address对象的结果,并将其作为属性直接传递到Person

答案 3 :(得分:3)

在Mustache中采用相同的方法如下:

你好

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

希望有所帮助......