当我尝试使用主干 js 创建集合集合时遇到了问题。
这是代码:
模型和集合:
var Track = Backbone.Model.extend({
defaults : {
title : ""
}
})
var TrackCollection = Backbone.Collection.extend({
model : Track,
})
var Playlist = Backbone.Model.extend({
defaults : {
name : "",
tracks : new TrackCollection,
}
})
var PlaylistCollection = Backbone.Collection.extend({
model : Playlist,
})
创建播放列表集合:
var playlists = new PlaylistCollection;
// create and push the first playlist
playlists.push({ name : "classic" });
// create and push a track in the playlist just created
playlists.last().get("tracks").push({ title : "fur elise" });
// create and push the second playlist
playlists.push({ name : "c2c" });
// create and push a track in the playlist just created
playlists.last().get("tracks").push({ title : "fuya" });
// display first playlist
console.log(JSON.stringify(playlists.at(0).toJSON()))
// display second playlist
console.log(JSON.stringify(playlists.at(1).toJSON()))
这是输出:
{"name":"classic","tracks":[{"title":"fur elise"},{"title":"fuya"}]}
{"name":"c2c","tracks":[{"title":"fur elise"},{"title":"fuya"}]}
问题是,正如我们在输出中看到的,2 个播放列表有 2 个轨道“fur elise”和“fuya”。
所以我的问题是为什么?为了让“fur elise”只出现在名为“classic”的第一个播放列表中,而“fuya”只出现在名为“c2c”的第二个播放列表中,我该怎么做?
谢谢你。
最佳答案
我认为您的问题是您的默认设置 tracks
PlayList
中的属性:
var Playlist = Backbone.Model.extend({
defaults : {
name : "",
tracks : new TrackCollection,
}
});
Backbone 将浅拷贝
defaults
创建新实例时:defaults
model.defaults or model.defaults()
[...]
Remember that in JavaScript, objects are passed by reference, so if you include an object as a default value, it will be shared among all instances.
结果是每一个
PlayList
使用默认值 tracks
的实例将使用完全相同的 TrackCollection
作为其 tracks
属性和那个 TrackCollection
将是 defaults
中引用的那个.最简单的解决方案是对
defaults
使用一个函数。 :var Playlist = Backbone.Model.extend({
defaults : function() {
return {
name : "",
tracks : new TrackCollection,
};
}
});
这样
defaults
函数将在需要默认值时调用,每次 defaults
被称为你会得到一个全新的 TrackCollection
在默认 tracks
属性。这里有一个快速的经验法则供您引用:
If you want to put anything other than strings, numbers, or booleans in
defaults
, use adefaults
function instead of adefaults
object.
关于collections - Backbone js 集合问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13675539/