【问题标题】:Backbone ViewModel vs (Data) Model骨干视图模型与(数据)模型
【发布时间】:2015-10-26 20:08:09
【问题描述】:

在主干中,我可以以不同的方式使用我的模型。

据我了解,(数据)模型用于存储数据(可能来自 RESTful Web 服务器),而 ViewModel 用于存储有关特定视图的信息(例如视图隐藏/显示状态)。

我的大部分知识来自this SO question。

看完this作者说的文章:

在数据更改时呈现 UI,而不是用户交互

流程是:用户交互->数据更改->视图渲染。

例如,如果我们在音频播放器中编写播放/暂停切换按钮,流程将是:

  • 用户点击“播放”
  • 模型(数据)状态变为“正在播放”
  • 视图以“播放”模式呈现

遵循此模式可确保从其他来源(例如快进、新播放列表、网络错误等)触发的状态更改将切换我们的按钮以执行正确的操作。换句话说,我们有一个单一的事实来源:每当我们的模型发生变化时,我们都知道我们应该渲染我们的按钮。

var PlayPauseButton = Backbone.View.extend({
  tagName: 'li',
  className: 'icon',
  initialize: function(){
    this.model.on('change:status', this.render, this);
  },
  render: function(){
    this.$el.removeClass('icon-play').removeClass('icon-pause');
    this.$el.addClass('icon-' + (this.isPlaying() ? 'pause' : 'play'));
  },
  events: {
    'click': function(){
      this.model.set('status', this.isPlaying() ? 'paused' : 'playing');
    }
  },
  isPlaying: function(){
    return this.model.get('status') === 'playing';
  }
});

我开始想知道使用每种方法的优缺点。

假设我们每个视图只有一个模型(我知道我们可以有更多,但如果我们将其限制为一个)。 我能想到,

ViewModel 专家:

  • 文章中提到的那些。
    • 有关视图的信息保存在模型中,防止视图混乱。
    • 状态信息可以在视图之间共享。

缺点:

  • 不能调用 Backbone 的 save() 方法,因为这会导致模型将不正确的数据保存到服务器(例如视图状态)。
  • 不能轻易调用 Backbone 的 fetch() 方法,因为我们可能会践踏我们的视图数据。

(数据)模型专家:

  • 使用主干的内置保存、获取等功能。
  • 视图可以共享数据,而无需担心视图中存储的特定数据。

缺点:

  • 模型只能用于数据

我这样想对吗?

我应该为我的数据建立一个模型,为我的视图建立一个模型吗?

这如何与集合一起使用?

我知道 Backbone 非常松散,没有硬性规定。 但是,有没有人有任何使用其中一种或另一种的实际经验?或者两者都有?

感谢任何帮助。

【问题讨论】:

    标签: javascript jquery backbone.js mvvm


    【解决方案1】:

    您实际上是在假设您不能在后端使用您的数据(域)模型,并且您需要将数据作为 ViewModel 对象来处理。 Stack Overflow 领域经验丰富的专业人士教我的方法是:

    1.) 始终将 ViewModel 用于视图。不要使用域模型。领域模型通常并不完全适合视图,这导致人们使用魔术字符串、请求缓存甚至会话来存储视图特定的信息,所有这些都是不必要的。

    2.) 由于这限制了您指出的方式,例如无法使用 Backbone 中内置的数据模型方法,请使用对象映射器,无论是您自己创建的还是其他人早先创建的,在需要使用时将 ViewModel 的属性映射到 Data 模型的属性。

    这允许您拥有高度特定的 ViewModel,而无需担心无法使用 Backbone 自己的数据模型。

    关于您关于集合的稍微分开的问题,您应该存储 ViewModel 对象的集合以用于您需要的其他东西。例如,如果您有一个 Cars 列表,您应该为您的 CarListViewModel 提供一个 CarViewModel 对象列表。如果您在模型阶梯上走这么远时选择使用 Data 对象,它的影响较小,但仍应避免。

    【讨论】:

    • 谢谢。你知道有什么好的主干/javascript 对象映射器吗?
    • 我不使用 Backbone,也从来没有使用过,但是视图模型和数据模型分离的概念也出现在 ASP.NET MVC 中,可以与 Backbone 一起使用。 MVC 最常见的做法是滚动您自己的映射器,这基本上是将数据模型传递给函数并传递视图模型,反之亦然。
    猜你喜欢
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-25
    • 2012-05-04
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多