我有一个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的属性对象中的一个属性。我找不到任何关于如何访问相关对象的属性的示例。
我感谢任何帮助!谢谢!
答案 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}}
希望有所帮助......