1

ノックアウトが期待どおりに機能しません。私のインターフェースです。私のミスだと思います。しかし、私はそれを理解することはできません。

ジャンルのトラックが含まれるジャンルのアルバムがあります。

var initialData = [{
    title: 'Danny',
    genres: [
        {id: 21,
        title: 'Noise'},
        {id: 22,
        title: 'EBM'}],
    tracks: [
        {title: 'Pony',
        genres: [
            {id: 21,
            title: 'Noise'},
            {id: 22,
            title: 'EBM'}]},
        {title: 'Hungry',
        genres: [
            {id: 21,
            title: 'Noise'},
            {id: 22,
            title: 'EBM'}]}
    ]

}];

アルバムのジャンルからトラックのジャンルへの一方向の同期を作成したい:

  • アルバムにジャンルを追加すると、このジャンルがすべてのトラックに追加されます。
  • アルバムからジャンルを削除すると、このジャンルはすべてのトラックから削除されます。
  • トラックにジャンルを追加すると、このジャンルはこのトラックにのみ追加されます。
  • トラックからジャンルを削除すると、このトラックからのみこのジャンルが削除されます。

私の同期は、次の関数で正常に動作します (1 つのケースを除く)。

self.addGenre = function(album) {
    var id = rand(),
        item = {
            id: id,
            title: ' genre #' + id
        };
    album.genres.push(item);

    if (album.tracks()) {
        $.each(album.tracks(), function (index, track) {
            track.genres.push(item);
        });
    }
};

self.removeGenre = function(genre) {
    $.each(self.albums(), function() {
        this.genres.remove(genre);
        if (this.tracks()) {
            $.each(this.tracks(), function (index, track) {
                track.genres.remove(genre);
            });
        }
    });
};

例外は、デフォルト (ノイズ、EBM、上記の initialData を参照) ジャンルをアルバムから削除する場合です。うまくいきません。

このケースを示すためにjsFiddleを作成し、console.log()デバッグするために多くのことを含めました

4

1 に答える 1

1

問題は、ko-mappingを使用すると、すべてのプロパティが監視可能に変わることです。作成する新しいジャンルは、単なる標準のバニラオブジェクトであるため、最初のオブジェクトと同じ種類のオブジェクトではありません。したがって、トラックから削除しようとしているジャンルは、アルバムから削除したものと同じではありません。

問題を修正する簡単な方法は、このフィドルのように、削除機能を変更することです。

$.each(this.tracks(), function(index, track) {
    var toRemove = ko.utils.arrayFirst(track.genres(), function(item) {
        return ko.utils.unwrapObservable(genre.id) == ko.utils.unwrapObservable(item.id);
    });
    track.genres.remove(toRemove);
});

より良い方法は、最初のビューモデル、新しいジャンル、またはその両方をもう少し徹底的に生成することです。これは簡単なことではありません。

于 2012-11-01T06:30:23.700 に答える