模型不触发解析函数
Model not firing parse function
我遇到了一个问题,我的主干模型没有正确解析某些东西。以下是列表.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;
}
});
相关文章:
- 如何在视图模型contet更新更新上调用Jquery函数
- Angular,函数在(模型)工厂中返回值
- 将模型从Kendo Mvc UI网格传递到javascript函数
- 模型不是构造函数主干
- 挖空视图模型函数仅影响最后一个实例
- 主干模型:初始化与构造函数
- 如何在amd架构的模型(主干)中调用collection函数
- 使用模型创建实例显示'不是函数'(节点使用猫鼬)
- 控制器内部的scope函数不根据视图中的ng模型更新值
- KnockoutJS:如何避免在applyBindings上运行视图模型函数
- 将值从Javascript函数传递到MVC模型
- 为什么我的作用域函数没有获取从模型传递的数据
- 在特定模型更新后,如何让keystoneJS运行函数
- 在IE9中未检测到视图模型函数绑定,但在FF和Chrome中有效
- 模型对象构造函数中的节点mysql查询
- Knockoutjs函数更新模型时应出现异常
- 在挖空中引用对象构造函数外部视图模型的属性
- 如何将模型对象传递给 javascript 函数
- 使用函数setTimerOut和jquery Cookie的模型窗口
- 在挖空JS中从ATTR调用模型函数以获取动态属性