我有一个可以通过某个视图编辑的模型;但是,在视图的底部,用户应该可以选择保存或放弃所有更改。这意味着您需要存储对模型所做的所有更改的列表,然后仅在单击“保存”按钮后进行这些更改。这听起来不必要地复杂,我想出了一个替代方法的想法,即创建模型的克隆并在视图中对其进行更改。然后,如果用户单击“保存”,则删除旧模型并将其集合中的新模型替换为新模型,否则您将丢弃克隆的模型。
这是一种可接受的方法,如果是这样,我该如何实施克隆过程?
这相当于再次从服务器获取数据(但似乎不需要额外的 HTTP 请求)。
我有一个可以通过某个视图编辑的模型;但是,在视图的底部,用户应该可以选择保存或放弃所有更改。这意味着您需要存储对模型所做的所有更改的列表,然后仅在单击“保存”按钮后进行这些更改。这听起来不必要地复杂,我想出了一个替代方法的想法,即创建模型的克隆并在视图中对其进行更改。然后,如果用户单击“保存”,则删除旧模型并将其集合中的新模型替换为新模型,否则您将丢弃克隆的模型。
这是一种可接受的方法,如果是这样,我该如何实施克隆过程?
这相当于再次从服务器获取数据(但似乎不需要额外的 HTTP 请求)。
您可以使用该clone
方法。下面的简短示例:
var Model = Backbone.Model.extend({});
var View = Backbone.View.extend({
initialize: function() {
this.realModel = this.model;
this.model = this.realModel.clone();
},
onSave: function() {
this.realModel.set(this.model.attributes);
}
});
你也可以做一些不同的事情:
var Model = Backbone.Model.extend({});
var View = Backbone.View.extend({
initialize: function() {
// save the attributes up front, removing references
this._modelAttributes = _.extend({}, this.model.attributes);
},
onSave: function() {
// revert to initial state.
this.model.set(this._modelAttributes);
}
});
你可以试试Backbone.Memento 。
如果不想使用也没问题。但是,您可以从代码库中很好地了解它应该如何完成。
我通常用视图上的对象缓存来解决这个问题。这样我就不会为模型/视图管理增加任何不必要的开销。如果用户在未保存的情况下关闭视图,则丢弃自然会发生。
var Model = Backbone.Model.extend({
'title': 'Hello'
});
var View = Backbone.View.extend({
initialize: function() {
// Holds temporary values until save
this.cache = {};
},
onTitle: function() {
this.cache.title = 'World';
},
onSave: function() {
this.model.set( this.cache );
}
});