【问题标题】:knockout: extending mapping to complex JSON淘汰赛:将映射扩展到复杂的 JSON
【发布时间】:2013-01-25 21:08:57
【问题描述】:

我从服务器收到一个复杂的 JSON。让它成为下一个:

var data = [{
    name: "name1",
    items:[
        {
        name:"name11",
        subItems:[{
                name:"name111",
                children[
                    {id:1,name:"child1111",status:"good"},
                    {id:2,name:"child1112",status:"bad"},
                    {id:3,name:"child1113",status:"good"}
                ]},
                {
                name:"name112",
                children[
                    {id:4,name:"child1121",status:"good"}]
                }]
        },
        {
        name:"name12",
        subItems:[{
                name:"name121",
                children[
                    {id:5,name:"child1211",status:"bad"}]
                }]
        }]
    },
    {
    name: "name2",
    items:[
        {
        name:"name21",
        subItems:[{
                name:"name111",
                children[
                {id:7,name:"child2111",status:"good"}
                ]}]
        }]
    }];

所以我有一个对象列表,每个对象都包含名称和项目属性。 Items 是类似对象列表的属性,每个对象都包含 name 和 subItems 属性。 subItems 属性与上一个相同,并具有 name 和 children 属性。 children 是我的实体列表。我使用 mapping 填充我的 ViewModel。 首先,我无法想象如何在我的实体中设置为键 id。我想知道如何“潜入”它。此外,我需要扩展我的实体。像下一个示例一样添加计算属性:

computProp: ko.computed(function() {return name+status;})

我不想创建 js 类,因为在这种情况下我看不到映射的好处。在这种情况下,我可以实现手动映射。对我来说会更清楚。

欢迎任何想法、建议或批评。

PS:我已经搜索/阅读过类似的topics

【问题讨论】:

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


    【解决方案1】:

    您必须显式声明子视图模型才能获得此行为,但您仍然可以从完成所有映射中受益

    http://jsfiddle.net/uXMhA/

    ChildViewModel = function(data) {
        ko.mapping.fromJS(data, {}, this);
        this.computProp = ko.computed(function() {
            return this.name() + this.status();
        }, this);
    };
    

    【讨论】:

    • 所以当我正确时 - 我需要通过循环抛出第一和第二级并映射 children?好的,但是在这种情况下我该如何更新它们?再次抛出循环?看不到任何优点和缺点 - 代码看起来很复杂,然后手动更新。
    • 您只需要映射children数组,其余的由框架完成。所以没有它不比手动更复杂
    • 我仍然无法得到它。 jsfiddle 中的结果在两个示例中都是空的。
    • 奇怪只在FF中测试过,在其他浏览器应该没有问题,检查错误控制台
    • 它有点复杂,因为映射插件只能创建叶子。您需要单独映射每个级别,例如 jsfiddle.net/uXMhA/2
    猜你喜欢
    • 1970-01-01
    • 2014-03-20
    • 2015-07-16
    • 1970-01-01
    • 2012-06-08
    • 1970-01-01
    • 2012-12-21
    • 1970-01-01
    • 2012-09-05
    相关资源
    最近更新 更多