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 : {
        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 a defaults function instead of a defaults object.

关于collections - Backbone js 集合问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13675539/

相关文章:

Java 全局 isEmpty() 方法

java ArrayList 和 JDBC

internet-explorer - Backbone.js:在 Internet Explorer 中使用 pushstate 实现基于斜杠的 URL 的解决方法

ruby-on-rails - 如何在 Rails、Devise 和 Backbone.js 中使用 token 身份验证?

javascript - 如何在单页移动 Web 应用程序中实现我自己的历史记录堆栈?

javascript - 简单事件backbone.js错误

java - 使用java中包含对象的属性获取arraylist的索引

c# - 从集合中删除项目的最佳方法

php - 未定义的属性:Illuminate\Database\Eloquent\Collection::$id Laravel 4

javascript - 从 Backbone.js 中的集合获取构建模型