【发布时间】:2013-07-01 09:42:35
【问题描述】:
我正在尝试映射 JSON 对象的所有可能嵌套对象,以便每个对象都成为可观察对象。我的印象是使用ko.mapping.fromJS 会导致所有对象及其对象变得可观察。但是,我没有看到这种情况发生。
如果您查看 JSFiddle 和下面的代码,您将看到 span 最初显示值“Test”。我的意图是单击按钮以使用stuff2 的内容更新viewModel,这应该将跨度的值更改为“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 对象如此庞大和复杂(这显然不是)怎么办?是否可以使用一些递归功能来遍历每个对象的嵌套对象以使它们都可观察?
【问题讨论】:
-
请注意,您拼写为
windows.viewModel而不是window.viewModel。然而,改变它给了我一个“超过最大调用堆栈大小”的消息,仍然在思考为什么。在任何情况下,将参数更改为medoes the trick。 -
更改为我当然适用于那个 jsfiddle .....遗憾的是,这并不能解决实际页面上的问题。一旦我弄清楚小提琴和实际页面之间有什么不同,我将不得不回到这一点。
-
非常感谢您对 Jeroen 的帮助。您确实解决了一些导致我遇到真正问题的问题......当我进行开发时,我倾向于使用 Chrome 开发人员工具和 javascript 中的调试器来完成我的工作。似乎淘汰赛和调试器 + Chrome 开发者工具不能很好地结合在一起。当我取出调试器或关闭开发人员工具时,它按预期工作
标签: object knockout.js mapping nested observable