视图应该设置模型数据吗?

时间:2011-10-03 06:39:00

标签: backbone.js

我只想弄清楚一个简单的问题。

视图是直接设置模型数据还是仅调用更改自己数据的模型方法?

2 个答案:

答案 0 :(得分:12)

像软件开发中的其他所有东西一样,“它取决于”。

如果您在视图中使用表单输入,并且只需要将这些输入中的数据输入到模型中,请直接设置数据。您可以通过多种方式执行此操作,包括从输入字段中“更改”事件,如下所示:

MyView = Backbone.View.extend({
  events: {
    "change #name", "setName"
  },

  setName: function(e){
    var val = $(e.currentTarget).val();
    this.model.set({name: val});
  }
});

另一方面,如果您正在开始在模型中设置数据的业务逻辑和其他代码(但实际上只将其作为业务逻辑的一部分),那么您应该调用一个方法模型。

“状态机”将是您何时执行此操作的一个很好的示例。或者,在我写的图库中,我对选择要显示的图像有一些逻辑。如果已选择图像,请勿再次选择。我把这个逻辑放在我的图像模型的方法中:

Image = Backbone.Model.extend({
  select: function(){
    if (!this.get("selected")){
      this.set({selected: true});
    }
  }
});

如图所示,我喜欢按照简单的规则运行,如果我在设置调用周围没有逻辑,那么我可以从任何地方直接设置它。如果有任何与模型相关的逻辑,在集合周围,那么我将它放在模型中。

无论哪种方式,当您确实想要设置数据时,都应该使用set方法。绕过这个并直接通过model.attributes设置模型的属性可以防止大量的Backbone代码被触发并可能导致问题。

答案 1 :(得分:1)

这取决于您的编程风格。我总是直接设置它们。如果Law of Demeter对您来说听起来不错并且您处于面向对象(并且可能具有Java / Microsoft -stack背景),那么样式将是创建getter / setter方法。

另一方面,如果你在“Size is the Enemy”阵营(我也推荐Jeff Atwood's comments)你当然应该直接设置模型数据(正如我之前所暗示的,我在这个阵营自己)。

话虽这么说,Backbone.js模型已经有getter和setter方法.get.set。您不应该直接操纵.attributes成员。我不确定你不应该从中读取它,我倾向于偶尔这样做而且因为那个原因而没有遇到问题。