在骨干网中,我可以用不同的方式使用我的模型。
据我所知,(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很松散,并没有严格的规则。 但是,有没有人有使用其中一个的真实世界经验?或者两者兼而有之?
感谢任何帮助。
答案 0 :(得分:3)
您实际上假设您无法在后端使用您的数据(域)模型,并且您需要将您的数据作为ViewModel对象处理。 Stack Overflow领域的经验丰富的专业人士教我这样做的方式是:
1。)始终将ViewModel用于视图。不要使用域模型。域模型通常不完全适合视图,这导致人们使用魔术字符串,请求缓存甚至会话来存储特定于视图的信息,所有这些都是不必要的。
2。)由于这限制了您指出的方式,例如无法使用Backbone内置的数据模型方法,请使用对象映射器,您可以使用自己创建的对象映射器,也可以使用之前制作的其他人,在需要使用时将ViewModel的属性映射到Data模型的属性。
这使您可以拥有高度特定的ViewModel,而无需担心无法使用Backbone自己的数据模型。
关于有关集合的稍微单独的问题,您应该将ViewModel对象的集合存储为您需要的其他内容。例如,如果您有一个Cars列表,则应该为CarListViewModel提供一个CarViewModel对象列表。如果你在模型的阶梯中选择使用数据对象,它的影响较小,但仍应避免使用。