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 sourcesave(...)。您的代码所做的是首先将 "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 : []
    });
},