Backbone.js 主干.模型:将集合设置为属性
我是新来的有骨气的人,面临以下问题。我试着模仿一些有很多关系的人。为了实现这一点,我将添加以下代码来初始化模型中的方法:Backbone.js 主干.模型:将集合设置为属性,backbone.js,backbone-model,Backbone.js,Backbone Model,我是新来的有骨气的人,面临以下问题。我试着模仿一些有很多关系的人。为了实现这一点,我将添加以下代码来初始化模型中的方法: defaults: { name: '', tags: [] }, initialize: function() { var tags = new TagsCollection(this.get('tags')); tags.url = this.url() + "/tags"; return this.set('tags', tags, { si
defaults: {
name: '',
tags: []
},
initialize: function() {
var tags = new TagsCollection(this.get('tags'));
tags.url = this.url() + "/tags";
return this.set('tags', tags, {
silent: true
});
}
如果我通过集合获取模型,这段代码非常有效。据我所知,第一个集合获取数据,然后这个集合用这些数据填充模型。但当我尝试加载单个模型时,我的属性会被普通Javascript数组覆盖
m = new ExampleModel({id: 15})
m.fetch() // property tags get overridden after load
答复:
{
name: 'test',
tags: [
{name: 'tag1'},
{name: 'tag2'}
]
}
有人知道怎么解决这个问题吗
还有一个问题。是否有办法检查模型是否已加载。是的,我知道我们可以向fetch方法添加回调,但是像model.isLoaded或model.isPending这样的东西呢
谢谢
当我尝试加载单个模型时,我的属性会被普通Javascript数组覆盖
您可以重写该方法以保持集合被覆盖:
parse: function(attrs) {
//reset the collection property with the new
//tags you received from the server
var collection = this.get('tags');
collection.reset(attrs.tags);
//replace the raw array with the collection
attrs.tags = collection;
return attrs;
}
有没有办法检查模型是否已加载
您可以将模型与其默认值进行比较。如果模型处于默认状态(保存其id),则不会加载该模型。如果没有,则加载:
isLoaded: function() {
var defaults = _.result(this, 'defaults');
var current = _.wíthout(this.toJSON(), 'id');
//you need to convert the tags to an array so its is comparable
//with the default array. This could also be done by overriding
//Model#toJSON
current.tags = current.tags.toJSON();
return _.isEqual(current, defaults);
}
或者,您可以钩住请求、同步和错误事件,以跟踪模型同步状态:
initialize: function() {
var self = this;
//pending when a request is started
this.on('request', function() {
self.isPending = true;
self.isLoaded = false;
});
//loaded when a request finishes
this.on('sync', function() {
self.isPending = false;
self.isLoaded = true;
});
//neither pending nor loaded when a request errors
this.on('error', function() {
self.isPending = false;
self.isLoaded = false;
});
}
1删除此之前的返回。设置,有关更多信息,请阅读1.1.0节。2 model.isLoaded-不确定是否存在,此属性是否应标记为已获取完成或其他内容?您好,谢谢您的评论。1我已经从coffeescript生成的initialize方法中删除了return,但它当然不能帮助我解决问题。你完全理解我。我的意思是一些方法,可以帮助我了解模型是否被获取。你能不能附上代码,你是如何加载单个模型的,看起来我明白了原因是什么。2i可以基于同步事件提供model.isLoaded实现,如果您有兴趣感谢您的回复。现在,当我获取一个模型时,它可以工作,但不适用于集合。有点奇怪的是,当集合首先创建模型时,它调用parse方法,然后调用initialize方法。所以,当我通过集合获取模型时,我无法访问属性标记,因为它尚未初始化。