javascript - 主干 ViewModel 与(数据)模型

标签 javascript jquery backbone.js mvvm

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

据我了解,(数据)模型用于存储数据(可能由 RESTful 网络服务器提供),ViewModel 用于存储有关特定 View 的信息(例如 View 的隐藏/显示状态)。

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

看完this作者说的文章:

Render UI Upon Data Change, Not User Interaction

The flow is : User interaction -> data change -> view render.

For instance, if we are writing a play/pause toggle button in an audio player, the flow would be:

  • The user hits ‘play’
  • The model (data) state changes to ‘playing’
  • The view renders in ‘playing’ mode

Following this pattern ensures that changes to the state triggered from other sources (such as fast forward, new playlist, network error, etc.) will toggle our button to do the right thing. In other words, we have a single source of truth: whenever our model changes we know we should render our button.

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';
  }
});

我开始想知道使用每一个的优点和缺点。

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

ViewModel 优点:

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

缺点:

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

(数据)模型优点:

  • 使用 backbone 的内置保存、获取等。
  • View 可以共享数据,而不必担心存储在其中的 View 特定数据。

缺点:

  • 模型只能用于数据

我这样想对吗?

我应该有一个数据模型和一个 View 模型吗?

这如何与集合一起使用?

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

感谢任何帮助。

最佳答案

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

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

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

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

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

关于javascript - 主干 ViewModel 与(数据)模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31808957/

相关文章:

javascript - 如何从javascript中的字符串对象中删除一组字符

javascript - 在 React : Uncaught TypeError: . 中调用函数 .. 不是函数(...)

javascript - 我怎样才能让 jquery datepicker 不工作克隆行

javascript - backbone.js 上下文中的依赖注入(inject)

javascript - 如何在自定义字体 css 文件中查找可用的字体粗细

javascript - 生成选择列表项问题

Javascript 和 Firebase 3 - 使用电子邮件和密码创建用户

jquery - ASP.NET MVC3 : Adding Textboxes with Jquery and binding to Model

javascript - Backbone /rails 之间使用 REST url 进行通信时出现问题

javascript - 你将如何移动一个完整的 backbone.js 树?