Backbone 我在成功回调和错误回调中看到的模型是不同的。 #Backbone 保存
Backbone model which I see in success callback and error callback is different. #Backbone save
我有一个 backbone 模型,其中有 Backbone 个集合。当我保存模型时,如果它成功,那么我的模型对象就会按原样正确构造。但是当发生错误时(比如验证错误),在错误回调中修改模型对象(模型对象内的集合被转换为数组)。结果,我为该集合定义的所有函数现在都是 "undefined" 并给我错误。
save : function() {
this.model.save(_.extend(originalModel.toJSON() || {}, this.model
.toJSON()), {
success : this.onSaveSuccess,
error: this.onSaveError,
include : []
});
},
onSaveSuccess : function(model) {
//Here the model is properly structured
},
onSaveError : function(model, response) {
// Here the model is modified, all collections are now array
//I have to explicitly call my parse method to re structure it.
model = model.parse(model.attributes);
}
我想知道为什么会这样。我在这里做错了吗?
为了这个例子,我们假设保存集合的模型的属性称为 "people"。它没有明确记录,但 model.save(attributes)
实际上表现得像:
model.set(attributes);
model.save();
Here's the relevant annotated source 个 save(...)
。您的代码所做的是首先将 "people" 属性设置为 array 人,然后尝试保存它。当保存失败时,您的模型具有 array,而不是集合,作为 "people".
的值
我怀疑您的终点是在成功时返回模型的完整表示,并且您的模型正在正确解析该表示并在此时重新构建集合。但是您的错误处理程序不会自动执行此操作。
顺便说一句,根据我的经验,包含集合的模型很难管理和推理。我有一个包含数据数组的模型,然后在该模型上有一个方法来动态构建一个集合,这让我很幸运。类似于:
var MyModel = Backbone.Model.extend({
// ...
getPeople: function() {
// See if we've previously built this collection
if (!this._peopleCollection) {
var people = this.get('people');
this._peopleCollection = new Backbone.Collection(people);
}
return this._peopleCollection;
}
});
这从服务器通信中移除了 Collection 概念(在这方面它是非常不必要的),同时还为您的应用程序提供了一个更智能的数据层(智能模型是一件好事)。
解决方法是在选项中传递 wait:true
。这不会修改,除非服务器 returns 有效响应。
save : function() {
this.model.save(_.extend(originalModel.toJSON() || {}, this.model
.toJSON()), {
success : this.onSaveSuccess,
error: this.onSaveError,
**wait:true**
include : []
});
},
我有一个 backbone 模型,其中有 Backbone 个集合。当我保存模型时,如果它成功,那么我的模型对象就会按原样正确构造。但是当发生错误时(比如验证错误),在错误回调中修改模型对象(模型对象内的集合被转换为数组)。结果,我为该集合定义的所有函数现在都是 "undefined" 并给我错误。
save : function() {
this.model.save(_.extend(originalModel.toJSON() || {}, this.model
.toJSON()), {
success : this.onSaveSuccess,
error: this.onSaveError,
include : []
});
},
onSaveSuccess : function(model) {
//Here the model is properly structured
},
onSaveError : function(model, response) {
// Here the model is modified, all collections are now array
//I have to explicitly call my parse method to re structure it.
model = model.parse(model.attributes);
}
我想知道为什么会这样。我在这里做错了吗?
为了这个例子,我们假设保存集合的模型的属性称为 "people"。它没有明确记录,但 model.save(attributes)
实际上表现得像:
model.set(attributes);
model.save();
Here's the relevant annotated source 个 save(...)
。您的代码所做的是首先将 "people" 属性设置为 array 人,然后尝试保存它。当保存失败时,您的模型具有 array,而不是集合,作为 "people".
我怀疑您的终点是在成功时返回模型的完整表示,并且您的模型正在正确解析该表示并在此时重新构建集合。但是您的错误处理程序不会自动执行此操作。
顺便说一句,根据我的经验,包含集合的模型很难管理和推理。我有一个包含数据数组的模型,然后在该模型上有一个方法来动态构建一个集合,这让我很幸运。类似于:
var MyModel = Backbone.Model.extend({
// ...
getPeople: function() {
// See if we've previously built this collection
if (!this._peopleCollection) {
var people = this.get('people');
this._peopleCollection = new Backbone.Collection(people);
}
return this._peopleCollection;
}
});
这从服务器通信中移除了 Collection 概念(在这方面它是非常不必要的),同时还为您的应用程序提供了一个更智能的数据层(智能模型是一件好事)。
解决方法是在选项中传递 wait:true
。这不会修改,除非服务器 returns 有效响应。
save : function() {
this.model.save(_.extend(originalModel.toJSON() || {}, this.model
.toJSON()), {
success : this.onSaveSuccess,
error: this.onSaveError,
**wait:true**
include : []
});
},