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

时间:2013-07-03 14:01:28

标签: knockout.js mapping observable

我是Knockoutjs的新手(并且通常不太适合javascript)并且我正在尝试映射JSON对象的所有可能的嵌套对象,以便每个人都可以观察到。我的印象是使用ko.mapping.fromJS会导致所有对象及其对象都是可观察的。但是,我没有看到这种情况发生。

我在jsfiddle中放置的并不是我真正做的事情,但它确实证明我正在尝试映射一个对象,然后将嵌套值绑定到HTML范围。

http://jsfiddle.net/Eves/L5sgW/32/< - 编辑:将此更新为相应的jsfiddle

HTML

<p> <span>Name:</span>
<span data-bind="text:  IntroData.Name))"></span>
</p>    

JS

$(function () {

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

    return me;
};

var stuff = {
    IntroData: {
        Name: 'Test'
    }
};
window.viewModel = ko.mapping.fromJS(new ViewModel(stuff));
ko.applyBindings(window.viewModel);
});

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

1 个答案:

答案 0 :(得分:1)

您的代码段和jsfiddle有几个问题:

  • 小提琴不包括映射插件
  • 小提琴不包含jQuery(但无论如何都可以删除特定于jQuery的代码)
  • span元素是自闭,但不应该
  • 映射插件期望“额外映射选项”作为第二个参数,me应该是第三个参数
  • 你错过了模型上的InitialLoadOfApplication函数(虽然我不清楚它的用途是什么)
  • 您对跨度的text绑定有两个不应该存在的迷路括号

如果我解决了所有这些问题,我最终会得到以下内容(另请参阅this fiddle):

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

这个Javascript:

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

    me.InitialLoadOfApplication = function() { alert('loading!'); };

    return me;
};

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

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

关于你的问题,映射插件可以根据我的经验处理相当复杂的对象。如果你到达它的边界,总会有“额外的映射信息”来处理边缘情况。 The relevant documentation很好地解释了这些。