无法使用嵌套对象解析knockout js

时间:2012-09-14 05:41:36

标签: ruby-on-rails-3 knockout.js knockout-mapping-plugin

我正在努力学习knockoutjs并且无法弄清楚儿童可观察的作品!我试过阅读很多文章和很多问题,甚至可能在某些地方遗漏了某些东西。

我的json结构是(由Rails json渲染器生成):

  

相册 - >曲目 - >元数据

Album
 -Track
  --Metadata
 -Track
  --Metadata
Album
 -Track     
  -- Metadata

我的视图也是嵌套的。在一个页面中,每个专辑都在一个div下,每个轨道都在上面div中的表行下面。

My View和JS代码在JS Fiddle中。 http://jsfiddle.net/var56/

问题: 如果你在JSFiddle中看到视图,你会看到我已经标记了html部分正在工作(专辑)而哪些部分无效(轨道)。初始视图正确呈现。当我在文本字段中更新相册名称时,上面的h2正在正确更新。但是在曲目模板中,当我更新曲目标题时,它不会在下面的跨度中更新。

此外,我试图在chrome控制台中导出数据。

ko.toJSON(viewModel)

,或者     ko.mapping.toJSON(视图模型)

它为我提供旧数据(这意味着,不会返回更改的值)。

我还会添加/删除相册&跟踪并希望viewModel和视图反映相同。

我错过了什么?


注意:实际的JSON数据在这里:

[
  { "id":9,
    "image_path":null,
    "name":"Test Album",
    "price":null,
    "sort_order":null,
    "tracks":[
      { "file_name":"01._Ei_Mon_Joshonay.mp3",
        "file_path":"/media/tracks/1/01._Ei_Mon_Joshonay.mp3",
        "id":192,
        "length":null,
        "metadata":{
          "artist":"Aroti (MR present)",
          "composer":"",
          "created_at":"2012-09-10T11:33:42Z",
          "duration":211,
          "genre":"Other",
          "id":124,
          "lyrics":null,
          "title":"01. Ei Mon Joshonay.mp3",
          "track_id":192,
          "updated_at":"2012-09-10T11:33:54Z",
          "year":0
        },
        "price":null,
        "thumb":"/media/track_thumbs/1/thumb_192.jpg",
        "title":"01. Ei Mon Joshonay.mp3"
      },
      { "file_name":"03._Jare_Ure_Ja_Pakhi.mp3",
        "file_path":"/media/tracks/1/03._Jare_Ure_Ja_Pakhi.mp3",
        "id":193,
        "length":null,
        "metadata":{
          "artist":"MR present",
          "composer":"",
          "created_at":"2012-09-10T11:33:48Z",
          "duration":204,
          "genre":"lata",
          "id":125,
          "lyrics":null,
          "title":"03.Jare ure ja pakhi",
          "track_id":193,
          "updated_at":"2012-09-10T11:33:54Z",
          "year":0
        },
        "price":99.0,
        "thumb":null,
        "title":"03.Jare ure ja pakhi"
      }
    ]
  },
  { "id":11,
    "image_path":null,
    "name":"Album 2",
    "price":null,
    "sort_order":null,
    "tracks":[  ]
  }
]

更新

我无法正常工作。现在我已经尝试创建一个可以模拟我面临的问题的jsFiddle。

请检查http://jsfiddle.net/Bb538/3/

我现在也是一个映射对象(虽然你可能看到的代码没有被引用,你可以试试,如果你想要的话)。您将看到相册名称正在正确更新。但标题和文件名字段不更新相邻的跨度(绑定到相同的observable)。

2 个答案:

答案 0 :(得分:2)

根据您的更新,问题不在于子对象不可观察,而是在轨道信息的输入字段中使用data-bind属性。 “value”data-bind不是“attr”数据绑定的子代。

这是一个有效的jsFiddle http://jsfiddle.net/Bb538/4/

你有什么

<input data-bind="attr: { name: 'albums[track_attributes][$index][id]', value: title}" id="" name="" type="text" value=""/>

它应该是什么

<input data-bind="attr: { name: 'albums[track_attributes][$index][id]'}, value: title" id="" name="" type="text" value=""/>

答案 1 :(得分:1)

我怀疑你的'track'对象和属性没有被映射插件映射到observable,这会阻止它们在值改变时通知视图,反之亦然。

查看我的Q&amp;这里将嵌套的JSON对象结构映射到代表性视图模型: Map JSON data to Knockout observableArray with specific view model type

关键外卖是映射对象,用于指定映射插件如何映射和转换嵌套对象。

以下是与您的专辑 - 曲目场景相关的具体示例: http://jsfiddle.net/KodeKreachor/qRKtK/26/