【发布时间】:2011-10-03 06:38:59
【问题描述】:
我只是想弄清楚一个可能很简单的问题。
视图应该直接设置模型数据还是只调用改变自己数据的模型方法?
【问题讨论】:
标签: backbone.js
我只是想弄清楚一个可能很简单的问题。
视图应该直接设置模型数据还是只调用改变自己数据的模型方法?
【问题讨论】:
标签: backbone.js
就像软件开发中的其他一切一样,“视情况而定”。
如果您在视图中使用表单输入,并且只需将这些输入中的数据获取到模型中,请直接设置数据。您可以通过多种方式执行此操作,包括来自输入字段的“更改”事件,如下所示:
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 的调用的逻辑为零,那么无论我在哪里,我都可以直接对其进行设置。如果有任何与模型相关的逻辑,围绕集合,那么我把它放在模型中。
无论哪种方式,当您确实要设置数据时,您应该使用set 方法。绕过这一点并直接通过model.attributes 设置模型的属性将防止许多 Backbone 的代码触发并可能给您带来问题。
【讨论】:
这取决于您的编程风格。我总是直接设置它们。如果 Law of Demeter 对您来说听起来不错,并且您正在使用面向对象(并且可能具有 Java/Microsoft 堆栈背景),那么样式将是创建 getter/setter 方法。
如果你在“Size is the Enemy”阵营(我也推荐Jeff Atwood's comments),你当然应该直接设置模型数据(正如我之前暗示的,我自己也在这个阵营)。
话虽如此,Backbone.js 模型已经有 getter 和 setter 方法 .get 和 .set。您不应直接操作 .attributes 成员。我不确定您是否应该从中阅读,我倾向于不时这样做,并且还没有因此而出现问题。
【讨论】: