我在成功回调和错误回调中看到的骨干模型是不同的。 #Backbone保存

时间:2015-02-06 19:06:30

标签: backbone.js jquery-callback backbone-collections backbone-model

我有一个骨干模型,里面有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);
    }

我想知道为什么会这样。我在这里做错了吗?

2 个答案:

答案 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 : []
    });
},