如何访问从车把模板的骨架模型的计算字段?(How to access a calculated fi

2019-07-29 10:55发布

我想从模板访问计算字段我在模型(Backbone.js的)来实现。 我需要一直以定义一个帮助做呢?

我认为这个问题与我的模型传递到模板的方式做。 如果我通过this.model.toJSON()我有机会获得属性,但不是我在它定义的函数。 如果我通过this.model直接我可以访问功能,但骨干模式不是属性。

Answer 1:

总是传递this.model.toJSON()到您的模板。

你需要做的就是你计算出的值是什么,是覆盖您toJSON方法,您的手机型号。


MyModel = Backbone.Model.extend({

  myValue: function(){
    return "this is a calculated value";
  },

  toJSON: function(){
    // get the standard json for the object
    var json = Backbone.Model.prototype.toJSON.apply(this, arguments);

    // get the calculated value
    json.myValue = this.myValue();

    // send it all back
    return json;
  }

})

现在,您可以访问myValue从由返回的JSON toJSON ,这意味着你可以访问它的视图。

另一种选择,正如你所说,是建立辅助方法,并与把手注册。 除非你有改变基于模板是如何被呈现,和/或正在传递到模板什么数据的一些功能,我不会打扰。



Answer 2:

这是另一种可能性:(从模型初始化)

initialize: function() {
        this.on("change", function () {
            this.set({ calculatedColumn: this.get("otherColumn") }, { silent: true });
        });
    },

在骨干计算属性



Answer 3:

我有同样的问题。 @DerickBailey是对的,当然,是压倒一切的toJSON做这项工作。 但它也泄漏到与服务器的通信(见姆姆对他的答案的评论)。

所以最终,我建立了一个骨干插件来专门处理数据导出到模板,并以最简单的操作: Backbone.Marionette.Export 。 它还涉及嵌套结构,照顾循环引用等查看文档 。

下面是它如何工作的。 包括插件文件到您的项目,并申报

MyModel = Backbone.Model.extend({

  foo: function () {
      return "I am a calculated value";
  },

  exportable: "foo"    // <-- this is the one line you have to add

});

如果你是一个木偶的用户,您已经在这一点上做。 foo显示在你的模板,就好像它是一个模型属性。

在平原骨干观点,只是叫myModel.export()myCollection.export()而不是他们的toJSON同行当你呈现。

对于服用参数的方法,有一个onExport处理程序。 例如,同样是在文档 。



Answer 4:

做到这一点的最好办法是将它添加到你的模型:

function initialize() {
    this.set("calculatedColumn", function () { return this.otherColumn; });
}

主干模型通常内部存储在“model.attributes”的实际数据值。 这就是为什么当你直接传递模型的模板,它只是增加了功能,直接建模和没有任何数据。 如果你使用model.toJSON()它通常在骨干为_.clone(model.attributes)来实现(见Backbone.js的)。 所以,你有数据,而不是直接添加到模型的功能。 这就是为什么上述作品 - 你设置的功能上model.attributes,而不是模型对象本身。 不要直接引用model.attributes,使用model.get( “calculatedColumn”)和model.set( “calculatedColumn”,...)。

所以model.get( “calculatedColumn”)返回的功能。 如果你去{{calculatedColumn}}在车把(假设你使用把手),它显示了函数的返回值。 但由于骨干网做了JSON.stringify到model.toJSON同步(在Backbone.js的)和JSON.stringify忽略功能calculatedColumn不会被发送到服务器。 如果你想JSON.stringify到不能忽视的功能(这样的功能变成的toJSON时是在模型运行数据值 - 视图渲染和模型同步-ING期间),覆盖model.toJSON就像@Derick贝利描述。

另外,还可以从Backbone.Model派生自己BaseModel并覆盖.toJSON,如果你需要得到来自BaseModel您的所有车型。 那么你就需要.toJSON的一个通用版本,可应用于任何模型。



文章来源: How to access a calculated field of a backbone model from handlebars template?