问题描述
||
我有一个Backbone模型,该模型的属性是对另一个Backbone模型的引用。例如,一个人对一个地址对象的引用。
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属性对象内的一个属性。我找不到如何访问关联对象的这些属性的任何示例。
感谢您的帮助!谢谢!
解决方法
尝试使用Handlebars,它是基于Mustache并具有嵌套属性支持的模板引擎。
这样就很容易
{{Address/City}}
。
如果您不想更改模板引擎,则可以将Address
对象的结果展平,并将其作为属性直接传递到Person
。
, 我最终通过以下方法解决了这个问题。
我从Mustache.js切换到Handlebars.js作为模板引擎。这使我可以使用基于路径的表达式来访问嵌套或关联的对象及其属性。
Hi {{FirstName}}. You live in {{Address.City}}.
但是,我还必须更改将JSON对象传递给模板的方式。我正在使用作为Backbone.Model类的一部分的toJSON方法。但是,这并没有正确地为关联的地址生成JSON(为了使模板正常工作。)它是将地址属性埋在名为\“ attributes \”的成员中。所以,我最终还是这样做了...
var jsonForTemplate = JSON.parse(JSON.stringify(person));
这为我提供了对象及其关联对象的“原始”版本,模板可以使用上述语法访问该版本。 JSON.parse和JSON.stringify都是json2.js的一部分。
, 我通过制作另一版本的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(); });
}
});
, 在小胡子中要遵循的相同方法如下:
你好
{{FirstName}},you live in {{#Address}}{{City}} {{/Address}}
希望能帮助到你..