2012-11-01 88 views
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()調試

回答

1

的問題是,當你使用KO映射,原來每個屬性變成可觀察到的。您創建的新流派與最初的對象不是同一種對象,因爲它們只是標準的香草對象。因此,您嘗試從曲目中刪除的流派與您從專輯中刪除的流派不同。

解決您的問題的一種簡單方法是更改​​移除功能,如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); 
}); 

一個更好的辦法是有點更徹底生成您的初始視圖模型,新的流派,或兩者兼而有之。這並不容易。

+0

我懷疑是在ko-mapping的原因,但不知道'unwrapObservable'的解決方案。謝謝! –