如何在knockoutjs中绑定嵌套选项

时间:2012-10-31 11:38:47

标签: javascript data-binding knockout.js knockout-2.0

我有一个基于淘汰赛的专辑编辑界面

专辑的对象有这样的结构:

  • 专辑
    • 标题
    • 日期
    • 艺术家(阵)
      • ID
      • 标题
    • 流派(数组)
      • ID
      • 标题
    • 曲目(数组)
      • ID
      • 标题
      • 艺术家(阵)
        • ID
        • 标题
      • 流派(数组)
        • ID
        • 标题

我创建了一个fiddle来展示我的工作和问题

我认为问题出在tracks: ko.observableArray(album.tracks)

var initialData = […];

var AlbumsModel = function(album) {
    var self = this;
    self.albums = ko.observableArray(ko.utils.arrayMap(album, function(album) {
        return {
            title: album.title,
            image: album.image,
            artists: ko.observableArray(album.artists),
            date: album.date,
            genres: ko.observableArray(album.genres),
            composers: ko.observableArray(album.composers),
            lyricists: ko.observableArray(album.lyricists),
            tracks: ko.observableArray(album.tracks)
        }
    }));
            self.lastSavedJson = ko.observable('')
    self.save = function(formElement) {
        self.lastSavedJson(JSON.stringify(ko.toJS(self.albums), null, 2));
    };
};

ko.applyBindings(new AlbumsModel (initialData));

什么是罚款

  • 相册的标题绑定
  • 相册的流派绑定
  • 相册的艺术家绑定

什么是破碎
binding =双向绑定(例如,在编辑歌曲名称时,tracklist未更新)

  • 跟踪标题绑定
  • 跟踪流派绑定
  • 跟踪艺术家绑定

我做错了什么?

1 个答案:

答案 0 :(得分:1)

你是对的:你正在做的方式,轨道属性(id,title等)不是作为observables创建的,而只是作为普通的javascript原语。

我认为你有两个选择:

  1. 考虑使用ko映射插件,它将创建所有内容(模型中所有对象的所有属性)作为可观察对象(如果是这种情况)。
  2. 在函数中包含tracks属性的创建,以使每个轨道(及其属性)都可观察。
  3. 如果您选择第一个,请查看mapping plugin documentation

    如果您选择第二个,您可以更改track属性的创建,如下所示:

    tracks: ko.observableArray(ko.utils.arrayMap(album.tracks,
        function(track) {
            return {
                id: track.id,
                title: ko.observable(track.title),
                artists: track.artists,
                date: track.date,
                genres: track.genres,
                composers: track.composers,
                lyricists: track.lyricists,
                lyrics: track.lyrics
            }
        }))
    

    对于第二个版本,I modified your fiddle稍微测试一下。