模型不触发解析函数

Model not firing parse function

本文关键字:函数 模型      更新时间:2023-09-26

我遇到了一个问题,我的主干模型没有正确解析某些东西。以下是列表.js:

SpendYourSavings.Models.Listing = Backbone.Model.extend({
    urlRoot: "api/listings/",
    images: function() {
        this._images = this._images || new SpendYourSavings.Collections.Images([], { listing: this });
        return this._images;
    },
    reviews: function() {
        this._reviews = this._reviews || new SpendYourSavings.Collections.Reviews([], { listing: this });
        return this._reviews;
    },
    shop: function() {
        this._shop = this._shop || new SpendYourSavings.Models.Shop([], { listing: this });
        return this._shop;
    },

    parse: function(data) {
        if(data.images) {
            this.images().set(data.images, { parse: true });
            delete data.images;
        }
        if(data.reviews) {
            this.reviews().set(data.reviews, { parse: true });
            delete data.reviews;
        }
        if(data.shop) {
            this.shop().set(data.shop, { parse: true });
            delete data.shop;
        }
        return data;
    }
});

图片和评论有效,但商店不太有效。它正确设置了商店的属性,但无法正确设置图像。

这是商店.js:

SpendYourSavings.Models.Shop = Backbone.Model.extend({
    urlRoot: "/api/shops",
    reviews: function() {
        this._reviews = this._reviews || new SpendYourSavings.Collections.Reviews([], {});
        return this._reviews;
    },
    listings: function() {
        this._listings = this._listings || new SpendYourSavings.Collections.Listings([], {});
        return this._listings;
    },
    user: function() {
        this._user = this._user || new SpendYourSavings.Models.User([], {});
        return this._user;
    },
    image: function() {
        this._image = this._image || new SpendYourSavings.Models.Image([], {});
        return this._image
    },
    parse: function(data) {
        console.log("shop parse data: " + data);
        debugger
        if(data.listings) {
            this.listings().set(data.listings, { parse: true });
            delete data.listings;
        }
        if(data.reviews) {
            this.reviews().set(data.reviews, { parse: true });
            delete data.reviews;
        }
        if(data.user) {
            this.user().set(data.user, { parse: true });
            delete data.user;
        }
        if(data.image) {
            debugger
            this.image().set(data.image, { parse: true });
            delete data.image;
        }
        return data
    }
});

商店中的解析函数.js即使我在列表中收到商店也从来没有.js解析函数! shop.image()没有正确设置为图像模型,所以我必须调用像shop.get('image').url这样不稳定的东西来获取 url。

据推测,您在商店中记住图像模型的原因是为了维护侦听器并保留该模型的单个实例。

Collection#set采用一个parse选项,告诉它对集合上设置的所有模型调用 parse。 Model#set 是使用从 parse 返回的属性调用 parse 立即调用的方法。

在这种情况下,我们希望使用解析的属性在关联的shop模型上调用#set。所以首先让我们打电话给parse.它应该看起来像这样:

SpendYourSavings.Models.Listing = Backbone.Model.extend({
    urlRoot: "api/listings",
    images: function() {
        this._images = this._images || new SpendYourSavings.Collections.Images([], { listing: this });
        return this._images;
    },
    reviews: function() {
        this._reviews = this._reviews || new SpendYourSavings.Collections.Reviews([], { listing: this });
        return this._reviews;
    },
    shop: function() {
        // Notice the first argument is an object when initializing models.
        this._shop = this._shop || new SpendYourSavings.Models.Shop({}, { listing: this });
        return this._shop;
    },
    parse: function(data) {
        if(data.images) {
            this.images().set(data.images, { parse: true });
            delete data.images;
        }
        if(data.reviews) {
            this.reviews().set(data.reviews, { parse: true });
            delete data.reviews;
        }
        if(data.shop) {
            var shopParams = this.shop().parse(data.shop);
            this.shop().set(shopParams);
            delete data.shop;
        }
        return data;
        }
    }
});

您的问题是set上的parse: true仅适用于集合。

这些线条

this.images().set(data.images, { parse: true });
this.reviews().set(data.reviews, { parse: true });

工作,因为您说的是"从此 JSON 添加全新的模型"。

此行

this.image().set(data.image, { parse: true });

但是,试图说,解析这些参数并设置值,但这在模型上很奇怪。它应该只解析传入的属性吗?它应该合并模型已经具有的属性吗?如果模型中已有的事物与正在解析的事物之间存在依赖关系怎么办?

相反,您可以尝试重组顶级解析,例如

SpendYourSavings.Models.Listing = Backbone.Model.extend({
    urlRoot: "api/listings/",
    images: function() {
        return this.get('images');
    },
    reviews: function() {
        return this.get('reviews');
    },
    shop: function() {
        return this.get('shop');
    },
    parse: function(data) {
        if (data.images){
            data.images = new SpendYourSavings.Collections.Images(data.images, { listing: this, parse: true});
        }
        if (data.reviews){
            data.reviews = new SpendYourSavings.Collections.Reviews(data.reviews, { listing: this, parse: true});
        }
        if (data.shop){
            data.shop = new SpendYourSavings.Models.Shop(data.shop, { listing: this, parse: true});
        }
        return data;
    }
});