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