Knockout.mapping是否可以观察所有嵌套对象?

时间:2013-07-03 15:44:26

标签: object knockout.js mapping nested observable

我正在尝试映射JSON对象的所有可能的嵌套对象,以便每个对象都成为一个可观察的对象。我的印象是使用ko.mapping.fromJS会导致所有对象及其对象变得可观察。但是,我没有看到这种情况发生。

如果您查看下面的JSFiddle和代码,您会看到跨度最初显示的值为“Test”。我的目的是单击按钮以使用stuff2的内容更新viewModel,这应该将span的值更改为“Test2”。但是,按钮单击不会更新任何内容。

http://jsfiddle.net/Eves/L5sgW/38/

HTML:

<p> <span>Name:</span>
<span data-bind="text: IntroData.Name"></span>
<button id="update" data-bind="click: Update">Update!</button>
</p>

JS:

var ViewModel = function (data) {
    var me = this;
    ko.mapping.fromJS(data, {}, me);

    me.Update = function () {
        ko.mapping.fromJS(stuff2, {}, windows.viewModel);
    };

    return me;
};

var stuff = {
    IntroData: {
        Name: 'Test'
    }
};

var stuff2 = {
    IntroData: {
        Name: 'Test2'
    }
};

window.viewModel = ko.mapping.fromJS(new ViewModel(stuff));
ko.applyBindings(window.viewModel);

是否只是必须使用映射选项才能使嵌套对象可观察?如果是这样,如果JSON对象如此庞大和复杂(显然这不是),该怎么办?可以使用一些递归功能来遍历每个对象的嵌套对象,使它们都可以观察到吗?

1 个答案:

答案 0 :(得分:0)

如下修改更新功能将起作用。

me.Update = function () {
    ko.mapping.fromJS(stuff2, {}, windows.viewModel);
};