【问题标题】:Should views set model data?视图应该设置模型数据吗?
【发布时间】:2011-10-03 06:38:59
【问题描述】:

我只是想弄清楚一个可能很简单的问题。

视图应该直接设置模型数据还是只调用改变自己数据的模型方法?

【问题讨论】:

    标签: backbone.js


    【解决方案1】:

    就像软件开发中的其他一切一样,“视情况而定”。

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

    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 的代码触发并可能给您带来问题。

    【讨论】:

      【解决方案2】:

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

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

      话虽如此,Backbone.js 模型已经有 getter 和 setter 方法 .get.set。您不应直接操作 .attributes 成员。我不确定您是否应该从中阅读,我倾向于不时这样做,并且还没有因此而出现问题。

      【讨论】:

        猜你喜欢
        • 2016-12-23
        • 1970-01-01
        • 2013-05-07
        • 2012-11-07
        • 2017-09-29
        • 2011-05-26
        • 2011-01-15
        • 2015-03-13
        • 2017-10-26
        相关资源
        最近更新 更多