Backbone js 集合的集合问题

2023-11-23

当我尝试使用主干 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,
    }
});

主干将浅复制defaults创建新实例时:

defaults model.defaults or model.defaults()
[...]
请记住,在 JavaScript 中,对象是通过引用传递的,因此如果您包含一个对象作为默认值,它将在所有实例之间共享。

结果是每一个PlayList使用默认值的实例tracks将使用完全相同的TrackCollection as its tracks属性和那个TrackCollection将是在defaults.

最简单的解决方案是使用一个函数defaults:

var Playlist = Backbone.Model.extend({
    defaults : function() {
        return {
            name : "",
            tracks : new TrackCollection,
        };
    }
});

这样一来defaults当需要默认值时,每次都会调用函数defaults被称为你会得到一个全新的TrackCollection在默认情况下tracks属性。

这里有一个快速的经验法则供您参考:

如果您想将字符串、数字或布尔值以外的任何内容放入defaults, use a defaults函数而不是defaults object.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Backbone js 集合的集合问题 的相关文章

随机推荐