Backbone ViewModel vs(Data)Model

时间:2015-08-04 12:08:21

标签: javascript jquery backbone.js mvvm

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

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

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

阅读作者所说的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很松散,并没有严格的规则。 但是,有没有人有使用其中一个的真实世界经验?或者两者兼而有之?

感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

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

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

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

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

关于有关集合的稍微单独的问题,您应该将ViewModel对象的集合存储为您需要的其他内容。例如,如果您有一个Cars列表,则应该为CarListViewModel提供一个CarViewModel对象列表。如果你在模型的阶梯中选择使用数据对象,它的影响较小,但仍应避免使用。