Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 主干视图模型与(数据)模型_Javascript_Jquery_Backbone.js_Mvvm - Fatal编程技术网

Javascript 主干视图模型与(数据)模型

Javascript 主干视图模型与(数据)模型,javascript,jquery,backbone.js,mvvm,Javascript,Jquery,Backbone.js,Mvvm,在主干网中,我可以用不同的方式使用我的模型 据我所知,(数据)模型用于存储数据(可能来自RESTful web服务器),而ViewModel用于存储关于特定视图的信息(例如视图隐藏/显示状态) 我的大部分知识都来自于这个问题 读了这篇文章后,作者说: 在数据更改时呈现UI,而不是用户交互 及 流程是:用户交互->数据更改->视图渲染 例如,如果我们在音频播放器中编写播放/暂停切换按钮,则流程为: 用户点击“播放” 模型(数据)状态更改为“播放” 视图以“播放”模式渲染 遵循此模式可确保从其他

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

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

我的大部分知识都来自于这个问题

读了这篇文章后,作者说:

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

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

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

  • 用户点击“播放”
  • 模型(数据)状态更改为“播放”
  • 视图以“播放”模式渲染
遵循此模式可确保从其他来源(如快进、新播放列表、网络错误等)触发的状态更改将切换我们的按钮以执行正确的操作。换句话说,我们只有一个真实来源:每当我们的模型改变时,我们知道我们应该渲染我们的按钮

我开始怀疑使用每一个的优点和缺点

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

ViewModel专业版:

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

  • 无法调用主干的save()方法,因为这将导致模型将不正确的数据保存到服务器(例如视图状态)
  • 无法轻松调用主干的fetch()方法,因为我们可能会破坏视图数据
(数据)模型专业人员:

  • 使用主干内置的保存、获取等功能
  • 视图可以共享数据,而不必担心存储在其中的视图特定数据
缺点:

  • 模型只能用于数据
我这样想对吗

我应该有一个数据模型和视图模型吗

这是如何处理集合的

我知道脊梁很松,没有硬性规定。 但是,有没有人有使用其中一种的实际经验?或者两者都有可能


非常感谢您的帮助。

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

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

2.)由于这限制了您所指出的方法,例如无法使用内置于主干网中的数据模型方法,因此在需要使用时,可以使用您自己创建的对象映射器或其他人之前创建的对象映射器,将ViewModel的属性映射到数据模型的属性

这允许您拥有高度特定的ViewModels,而无需担心无法使用主干网自己的数据模型


关于集合的问题,您需要存储ViewModel对象的集合以满足其他需要。例如,如果您有一个汽车列表,则应为CarListViewModel提供一个CarViewModel对象列表。如果您在模型的阶梯上走到这一步时选择使用数据对象,其影响较小,但仍应避免使用。

谢谢。你知道有什么好的主干/javascript对象映射器吗?我不使用主干,也从来没有使用过,但是在ASP.NET MVC中也出现了视图模型和数据模型分开的概念,可以与主干一起使用。MVC最常见的实践是使用自己的映射器,这基本上是将数据模型传递给函数,并将viewmodel传递给函数,反之亦然。
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';
  }
});