Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Collections 收集问题_Collections_Backbone.js - Fatal编程技术网

Collections 收集问题

Collections 收集问题,collections,backbone.js,Collections,Backbone.js,当我尝试使用主干js创建集合集合时,遇到了一个问题。 代码如下: 模型和集合: var Track = Backbone.Model.extend({ defaults : { title : "" } }) var TrackCollection = Backbone.Collection.extend({ model : Track, }) var Playlist = Backbone.Model.extend({ defaults :

当我尝试使用主干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"}]}
问题是,正如我们在输出中看到的,这两个播放列表有两首曲目“fur elise”和“fuya”

所以我的问题是为什么?我该怎么做才能让“fur elise”只出现在第一个名为“classic”的播放列表中,而“fuya”只出现在第二个名为“c2c”的播放列表中


谢谢。

我认为您的问题在于
播放列表中的默认
曲目属性:

var Playlist = Backbone.Model.extend({
    defaults : {
        name : "",
        tracks : new TrackCollection,
    }
});
主干将在创建新实例时浅层复制:

默认值
model.defaults或model.defaults()

[…]
请记住,在JavaScript中,对象是通过引用传递的,因此,如果您将对象作为默认值包含进来,那么它将在所有实例之间共享

结果是,每个使用默认
曲目的
播放列表
实例都将使用与其
曲目
属性完全相同的
TrackCollection
,并且
TrackCollection
将是
默认值
中引用的实例

最简单的解决方案是为
默认值使用函数:

var Playlist = Backbone.Model.extend({
    defaults : function() {
        return {
            name : "",
            tracks : new TrackCollection,
        };
    }
});
这样,当需要默认值时将调用
defaults
函数,每次调用
defaults
时,您将在default
tracks
属性中获得一个全新的
TrackCollection

这里有一个简单的经验法则:

如果要将字符串、数字或布尔以外的任何内容放入
默认值
,请使用
默认值
函数而不是
默认值
对象


你完全正确,我以为它在实例化时复制了默认值。无论如何,非常感谢您的回复!这是一个很好的信息,也非常相关,但是在初始化方法中创建一个新集合可能更简单、更清晰吗?@AlexMills:也许吧。我对他们的情况了解得不够多,不能说。这个答案更像是一种“如果你要这样做,那么就这样做”之类的东西。谢谢Mu,给你一个问题-我想质疑一下你所说的默认值作为对象与默认值作为函数的关系。在我的一个模型中,我的默认值是一个对象,所有默认属性都是null值,但这并不意味着当我创建该模型的新实例时,所有其他先前创建的实例值都将变为null。这怎么可能与您所说的共享单个值一致?@AlexMills:
null
是不可变的,数组或对象不是: