我是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对象如此庞大和复杂(显然这不是),该怎么办?可以使用一些递归功能来遍历每个对象的嵌套对象,使它们都可以观察到吗?
答案 0 :(得分:1)
您的代码段和jsfiddle有几个问题:
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很好地解释了这些。