【问题标题】:Extending a child object with Knockout Mapping使用 Knockout 映射扩展子对象
【发布时间】:2014-02-24 23:22:00
【问题描述】:

考虑这个 JSON 对象:

{
    "BusinessModels":[
        { 
            "Id":1,
            "Name":"Business to Business",
            "Businesses":[],
            "ReportTypes":[
                {...},
                {...},
                {
                    "Id":6,
                    "Name":"Risk",
                    "BusinessModelId":1,
                    "Reports":[
                        {
                            "Id": 4,
                            "Name": "Test",
                            "Value": ko.observable() // NEED TO ADD THIS PROPERTY USING MAPPING
                        },
                        {...}
                    ]
                }
            ],
        }
    ]
}

我正在尝试使用以下代码添加值,但它似乎不起作用。

var mapping = {
    'BusinessModels': {
        create: function(options) {
            return new function() {
                var self = options.data;
                self.SelectedBusiness = ko.observable();
                self.Businesses.unshift({ Id: 0, Name: 'All Clients' });
                ko.mapping.fromJS(self, {}, this);
            };
        }
    },
    'Reports': {
        create: function (options) {
            return new function () {
                var self = options.data;
                self.Value = ko.observable();
                ko.mapping.fromJS(options.data, {}, this);
            };
        }
     }
};

var model = ko.mapping.fromJSON(raw, mapping);
ko.applyBindings(model);

我需要给一个子对象“报告”一个名为 Valueko.observable 对象。如何在 ko.mapping 中执行此操作?

【问题讨论】:

  • 我不太确定你在问什么。如果您要使用您想要的结构手动构建它,您可以发布一个“之后”对象吗?
  • 我更新了我的评论。我只需要为孩子添加一个属性,但我的映射不起作用。

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


【解决方案1】:

嗯,很快。我想出了答案。

var mapping = {
    'BusinessModels': {
        create: function (options) {
            return new function () {
                var self = options.data;
                self.SelectedBusiness = ko.observable();
                self.Businesses.unshift({ Id: 0, Name: 'All Clients' });
                ko.mapping.fromJS(self, mapping, this);
            };
        }
    },
    'Reports': {
        create: function (options) {
            return new function () {
                var self = options.data;
                self.Value = ko.observable();
                ko.mapping.fromJS(self, mapping, this);
            };
        }
    }
};

我没有使用ko.mapping.fromJS(self, {}, this),而是使用了ko.mapping.fromJS(self, mapping, this)。原因是 Reports 是 BusinessModels 的嵌套对象。

【讨论】:

  • 我正要发布几乎相同的内容。 ko.mapping.fromJS 启动一个全新的地图,除非您提供映射配置,否则它只会执行默认地图。 Reports 是 BusinessModels 的子项这一事实无关紧要。我会向 fromJS 函数提供一个显式映射,该映射仅包含 Reports 定义,而不是传入外部映射,然后再次进入 Reports fromJS 调用,如果 JSON 字段名称重复,您可能会进入无限循环
  • 感谢您的帮助!
猜你喜欢
  • 2013-12-14
  • 1970-01-01
  • 2014-04-29
  • 2012-03-23
  • 2012-08-26
  • 2012-06-08
  • 1970-01-01
  • 2012-04-16
  • 2015-03-29
相关资源
最近更新 更多