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'}]}
    ]

}];

我想在专辑流派与曲目流派之间创建单向同步:

  • 如果我将流派添加到专辑中,则该流派将添加到所有曲目中。
  • 如果我从专辑中删除流派,则该流派将从所有曲目中删除。
  • 如果我将流派添加到轨道,则该流派将仅添加到该轨道。
  • 如果我从曲目中删除流派,则该流派将仅从该曲目中删除。

我的同步工作正常(除了一种情况)这个功能:

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 时,它会将每个属性都变成一个 observable。您创建的新类型与初始对象不是同一类对象,因为它们只是标准的香草对象。因此,您尝试从曲目中删除的流派与您从专辑中删除的流派不同。

解决问题的一种简单方法是更改​​删除功能,如this fiddle

$.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 回答