12

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

4 回答 4

8

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

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

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

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

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

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

于 2011-06-04T18:52:35.510 回答
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(); });
  }
});
于 2011-07-08T23:06:54.203 回答
5

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

然后它会像{{Address/City}}.

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

于 2011-06-04T14:05:19.850 回答
3

在 Mustache 中进行相同操作的方法如下:

你好

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

希望能帮助到你..

于 2011-07-27T15:12:46.430 回答