数据绑定嵌套JSON与Knockoutjs

时间:2012-01-31 23:08:05

标签: knockout.js javascript-framework knockout-mapping-plugin

我有一个包含数组数组的JSON结构。我有一个View Model,它使用包含Observable数据的Observable Arrays定义对象,然后将这些对象嵌套在其他Arrays和Observable中。

加载包含包含Observable数据的嵌套Observable Arrays的View Model的最简单方法是什么?

实施例: http://jsfiddle.net/uyQb6/1/

2 个答案:

答案 0 :(得分:3)

您可以使用映射插件进行探索,但是选项对象会变得复杂,因为每个创建回调都必须再次调用映射插件,然后添加任何dependentObservables,并且更容易使所有属性都可观察。

你可以坚持你的构造函数并使用类似ko.utils.arrayMap的东西,这只是一个循环数组的简单函数,并将每个项目重新映射到你从你提供的函数返回的任何内容。

以下是添加了ko.utils.arrayMap次调用的示例: http://jsfiddle.net/rniemeyer/VUfSS/

答案 1 :(得分:0)

更新:如果您的嵌套列表依赖于主列表,这是您的解决方案,否则@ rp-niemeyer解决方案是最好的。

如果我做对了,就说你有这样的JSON数据:

{
    appId: 1,
    appName: 'my app 1',
    modules:[
        {module1:1, moduleName: 'module 1'}, {module1:2, moduleName: 'module 2'}]
},
{
    appId: 2,
    appName: 'my app2',
    modules:[
        {module1:3, moduleName: 'module 3'}, {module1:4, moduleName: 'module 4'}]
}

这将是你的viewModel:

function myViewModel(){
    var self = this;
    self.appList = ko.observableArray(data);
    self.moduleList = ko.observableArray([]);

    // Set selectedApp in order to fill modulesList
    self.selectedApp = ko.observable();
    self.selectedApp.subscribe(function(v){
        // updates module list whenever selected app gets value.
        moduleList(v.modules);
    });
}

我没有测试它,但我确信你已经有了这个想法。