我有一个骨干模型,里面有Backbone Collections。当我保存模型并且如果它成功时,我的模型对象就是按原样正确构造的。但是当发生错误时(比如验证错误),在错误回调中修改模型对象(模型对象内的集合被转换为数组)。因此,为该集合定义的所有函数现在都是" 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);
}
我想知道为什么会这样。我在这里做错了吗?
答案 0 :(得分:2)
为了这个例子,让我们假设持有该集合的模型的属性被称为" people"。它没有明确记录,但model.save(attributes)
实际上表现得像:
model.set(attributes);
model.save();
save(...)
的{p> Here's the relevant annotated source。你的代码正在做的是首先设置" people"属性为人的数组,然后尝试保存它。当保存失败时,您的模型将数组而不是集合作为" people"的值。
我怀疑你的终点是在成功时返回模型的完整表示,并且你的模型正确地解析了该表示&在那时重新构建Collection。但是你的错误处理程序不会自动执行此操作。
顺便说一句,根据我的经验,包含馆藏的模型很难管理。理由。我有一个包含数据数组的模型,然后在该模型上有一个方法来动态构建一个Collection,我有更好的运气。类似的东西:
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概念(它非常不必要),同时还为您的应用程序提供更智能的数据层(智能模型是一件好事)。
答案 1 :(得分:0)
解决方法是在选项中传递wait:true
。除非服务器返回有效响应,否则不会修改此内容。
save : function() {
this.model.save(_.extend(originalModel.toJSON() || {}, this.model
.toJSON()), {
success : this.onSaveSuccess,
error: this.onSaveError,
**wait:true**
include : []
});
},