在Backbone.js中寻找有关MVC的指导

时间:2012-02-24 20:06:47

标签: javascript model-view-controller backbone.js

根据MVC,模型是一种“纯粹的”数据表示。您不需要表示或非DRY数据。例如,如果您的模型有“comment_count”字段,则它不应包含“use_plural”字段,以便您可以知道是否打印“评论”或“评论”。

This post has 0 comments
This post has 1 comment
This post has 2 comments
...

如果您将该信息放入模型中,那么关注点就会很糟糕,但另一种方法是在视图中导出该信息。例如:

var FooView = Backbone.View.extend({
  render: function(){
    this.data = this.model.toJSON();
    this.data.use_plural = this.data.comment_count === 1;
    // and fifty more lines like the above
    $(this.el).html(ich['foo_template'](this.data));
  }
});

我的问题是,似乎需要中间数据,这些数据太过于被视为模型的一部分,但是模型也是视图的一部分。这是MVVM解决的问题吗?我查了一下,但它看起来非常像微软技术堆栈。我正在考虑将它放入一个函数并从render()方法中调用它:

function deriveData(model){
  var data = model.toJSON();
  data.use_plural = data.comment_count === 1;
  // and fifty more lines like the above
  return data;
}

var FooView = Backbone.View.extend({
  render: function(){
    this.data = deriveData(this.model);
    $(this.el).html(ich['foo_template'](this.data));
  }
});

var BarView = Backbone.View.extend({
  render: function(){
    this.data = deriveData(this.model);
    $(this.el).html(ich['bar_template'](this.data));
  }
});

另一个想法是拥有一个AbstractView类并从中继承,如下所示:

var AbstractView = Backbone.View.extend({
  deriveData: function(){
    this.data = this.model.toJSON();
    this.data.use_plural = this.data.comment_count === 1;
    // and fifty more lines like the above
  }
});

var FooView = AbstractView.extend({
  render: function(){
    this.deriveData();
    $(this.el).html(ich['foo_template'](this.data));
  }
});

var BarView = AbstractView.extend({
  render: function(){
    this.deriveData();
    $(this.el).html(ich['bar_template'](this.data));
  }
});

这并不是因为我难倒,我只是想确保我不会在无知中漂浮,而有这种令人敬畏的方法可以解决这个问题。有没有人有任何建议或想法,或者我可以在这里利用完善的模式吗?感谢。

1 个答案:

答案 0 :(得分:4)

这是一种个人观点(即使它来自长期经验并且被许多人分享),所以请耐心等待。

MVC模式真的不适合网络。问题似乎总是存在于 Controller 中。许多已经存在一段时间的人知道这一点并默默地接受它。大多数框架使用术语MVC作为分类,因为很好地,在模式术语中解释框架的目标是什么,以及大多数其他类似的框架使用该术语。

如果你真的需要在Backbone中附加一个含义 View 以及谁是 Controller ,那么大多数人都认为它们都是View。视图生成模板,但也会将事件从UI调度到模型,反之亦然。如果你真的需要将它们分开,你也可以认为View类是 Controllers ,模板是 Views

希望你明白这一点:你称之为什么并不重要。虽然你如何使用它很重要。

关于问题的实际部分: 我会根据具体情况使用其中任何一种。你曾经使用过的小东西吗?在render内进行。是一些逻辑恰好是您的View架构的一部分,在多个视图中是否需要?从基类派生。与其他一切相同。