【问题标题】:Looking for guidance on MVC in Backbone.js在 Backbone.js 中寻找有关 MVC 的指导
【发布时间】:2012-02-24 20:06:46
【问题描述】:

根据 MVC,模型是一种“纯”数据表示。您不希望其中包含演示性或非 DRY 数据。例如,如果您的模型有一个“comment_count”字段,它不应该还包含一个“use_plural”字段,这样您就可以知道是打印“comment”还是“cmets”。

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 的地址吗?我查了一下,但它似乎非常特定于 Microsoft-tech-stack-specific。我正在考虑将它放入一个函数并从 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));
  }
});

这并不是我被难住了,我只是想确保我不会在无知中随波逐流,而有一种很棒的方法可以解决这个确切的问题。有没有人有任何建议或想法,或者我可以在这里利用成熟的模式吗?谢谢。

【问题讨论】:

  • 此外,我应该提到,模板通常具有执行此类操作的嵌入式逻辑,但使用无逻辑模板是不可能的,而且由于各种原因,我宁愿避免这样做。

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


【解决方案1】:

这是个人观点(即使它来自长期经验并被许多人分享),因此请持保留态度。

MVC 模式不太适合网络。而问题似乎总是出在 Controller 上。很多人都知道这一点,并默默地接受它。大多数框架使用术语 MVC 作为分类,因为用模式术语解释框架的目标很方便,而且大多数其他可比较的框架也使用该术语。

如果你真的需要为Backbone中的ViewController赋予意义,大多数人认为他们都是View。视图生成模板,但也将事件从 UI 发送到模型,反之亦然。如果你真的需要将它们分开,你也可以认为 View 类是 Controllers 而模板是 Views

希望你能明白:不管你怎么称呼它。重要的是你如何使用它。

关于您问题的实际部分: 我会根据上下文使用其中的任何一个。你用过一次的小东西吗?在render 里面做。它是不是恰好是您的视图架构的一部分并且在多个视图中需要的一些逻辑?从基类派生。与其他所有事情一样。

【讨论】:

  • 同意术语不令人满意。在 MVC 方面,每个框架似乎都有自己的私有语言。也很高兴 Backbone 将其“控制器”更改为“路由器”。它回避了一些混乱。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-25
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-28
  • 2012-02-03
相关资源
最近更新 更多