3

PlaylistItem コレクションだけでなく、それ自体を定義するいくつかのプロパティを持つ Playlist オブジェクトを使用しています。

サーバーからデータを受信すると、クライアント側の成功メソッドで JSON 応答を取得します。

success: function (data) {
    console.log("JSON data:", data);

    playlists = _.map(data, function (playlistConfig) {
        return new Playlist(playlistConfig);
    });

    ...
}

ここでは、JSON データをプレイリスト オブジェクトに変換します。各 Playlist オブジェクトは Backbone.Model です。

私のデータは次のようになります。

ここに画像の説明を入力

Playlist コンストラクタは次のようになります。

return function(config) {
    var playlist = new Playlist(config);

    return playlist;
};

var Playlist = Backbone.Model.extend({
    defaults: function() {
        return {
            id: null,
            userId: null,
            title: 'New Playlist',
            selected: false,
            position: 0,
            shuffledItems: [],
            history: [],
            items: Backbone.Collection.extend({
                model: PlaylistItem
            })
        };
    },
    ...
}

私の問題:

デフォルトで Playlist オブジェクトを作成すると、PlaylistItem の空の Backbone.Collection で初期化されます。ただし、定義済みのコレクションを使用して Playlist オブジェクトを作成すると、Backbone.Collection ではなく、基本的な配列が取得されます。これは、バックボーン エンティティにまだ変換されていないサーバーからの JSON データを操作しているためです。そのデータはプレイリストのデフォルトを超えて拡張され、Backbone.Collection エンティティを上書きします。

入力された Backbone.Collection で初期化する適切な方法は何ですか? 項目配列の型をチェックする Initializes にコードを記述できます。それが Backbone.Collection でない場合は、新しい Backbone.Collection を作成して項目を追加し、古い配列を新しい配列に置き換えることができますが、本当にばかげているようです。

4

2 に答える 2

1

PlalistItemsコレクションをデフォルト内で定義しないでください。ただし、事前に定義してください。次に、次のようにプレイリストモデルに初期化メソッドを作成します。

var PlaylistItems = Backbone.Collection.extend({
   ...
});

var Playlist = Backbone.Model.extend({
    initialize: function() {
        this.set('items', new PlaylistItems(this.items));
    },

    defaults: function() {
        return {
            id: null,
            userId: null,
            title: 'New Playlist',
            selected: false,
            position: 0,
            shuffledItems: [],
            history: [],
            items: []  // don't define your PlaylistItems Collection here
        };
}
});

ここでフィドルをチェックしてください:http://jsfiddle.net/georgedyer/r2XKb/ (コレクションを表示するにはコンソールを開く必要があります)

于 2013-01-22T02:16:10.817 に答える