【问题标题】:Access Nested Backbone Model Attributes from Mustache Template从 Mustache 模板访问嵌套的主干模型属性
【发布时间】:2011-09-08 05:02:50
【问题描述】:

我有一个 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 的属性对象中的一个属性。我找不到任何有关如何访问关联对象的这些属性的示例。

感谢您的帮助!谢谢!

【问题讨论】:

    标签: backbone.js mustache model-associations


    【解决方案1】:

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

    我为模板引擎从 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 的一部分。

    【讨论】:

    • 哦,太好了,这是我一直在寻找的解决方案
    【解决方案2】:

    我通过制作另一个名为 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(); });
      }
    });
    

    【讨论】:

    • 谢谢。我想知道这是否比我上面的方法更好。我认为最终结果是相似的。
    • 我想性能差不多。代码可读性和错误最小化是这里的好处,imo。
    • 谢谢。在递归调用 deepToJSON 之前,我不得不稍微修改你的以检查对象值是否为 null:if (!(_.isNull(obj[key]) || _.isUndefined(obj[key])) && _.isFunction(obj[key].deepToJSON)) {
    • @EricHu ha 我只是做了同样的事情(您的评论在我的浏览器的首屏下方)并且正要重新发布相同的评论。
    【解决方案3】:

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

    那么它就像{{Address/City}} 一样简单。

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

    【讨论】:

    • 谢谢,我一定要试试 Handlebars。我还是很好奇 Backbone 的 toJSON 是如何处理关联模型的。看起来(从 Firebug 中查看)它在“属性”成员下嵌套了关联模型的属性。我需要测试一下 Handlebars 是否可以找到地址/城市,或者我是否可能需要执行地址/属性/城市之类的操作。不确定。可能是一个不同的问题。
    • @Kevin Hey Kevin,你有没有想过:如何正确处理地址/属性/城市?
    【解决方案4】:

    在 Mustache 中实现相同的方法如下:

    你好

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

    希望对你有帮助..

    【讨论】:

    • 对我不起作用,至少在使用 pystache 时是这样。无法判断这是错误还是预期行为。
    • 如果您将主干模型(“this.model.toJSON()”)传递给模板添加 {{#attributes}} 可能会有所帮助。例如。 {{#attributes}} {{#Address}}{{City}} {{/Address}} {{/attributes}}
    猜你喜欢
    • 2012-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-26
    相关资源
    最近更新 更多