将自定义JavaScript模型映射到具有可观察对象的淘汰模型
我从服务器收到一个模型,它是一个(导航)菜单。 因此,它有1个根项和一个menuitems数组。根项目也有一个标题。 menuitems数组是一个包含标题和链接项(具有控制器、动作、css等属性的对象)的项目数组 我的knockout viewmodel中有相同的模型,但是所有的数组和属性都是可观察的数组/字符串/整数 现在当我这么做的时候将自定义JavaScript模型映射到具有可观察对象的淘汰模型,javascript,knockout.js,Javascript,Knockout.js,我从服务器收到一个模型,它是一个(导航)菜单。 因此,它有1个根项和一个menuitems数组。根项目也有一个标题。 menuitems数组是一个包含标题和链接项(具有控制器、动作、css等属性的对象)的项目数组 我的knockout viewmodel中有相同的模型,但是所有的数组和属性都是可观察的数组/字符串/整数 现在当我这么做的时候 vm.menuitems(menuitemsfromserver)我有一个带有可观察数组的菜单,但树中所有“下方”或“下方”的项目都是“普通”对象,不再可观
vm.menuitems(menuitemsfromserver)
我有一个带有可观察数组的菜单,但树中所有“下方”或“下方”的项目都是“普通”对象,不再可观察
我见过map
方法,但我对它没有任何意义。
模型是相同的,唯一的区别是一个由可观察的(-array)组成,另一个由普通javascript对象组成。有一个专门针对这种情况的插件: 根据其文件:
// Every time data is received from the server:
ko.mapping.fromJS(data, viewModel);
对象的所有属性都转换为可观察的属性。如果更新会改变值,它会更新可观察值
数组被转换为可观察数组。如果更新将更改项目的数量,它将执行适当的添加/删除操作。它还将尝试保持与原始JavaScript数组相同的顺序
在您的情况下,代码如下所示:
ko.mapping.fromJS(menuitemsfromserver, vm.menuitems)
它将迭代来自服务器的所有属性和menuitemsfromserver的所有数组,并将它们转换为可观察对象
插件最近没有得到积极维护,如图所示:,但出于这个目的,它仍然是一个有用的代码。谢谢。我会试试的。好吧,这部分有效。发生的情况是,它会覆盖原始对象,因此所有计算的属性都会被覆盖。解决其他人所做的问题的一种方法是,首先读取整个数据模型,然后将所有计算出的属性添加到viewmodel中。我觉得这不是一种干净的做事方式。我不确定我是否看到了整个画面。我通常使用映射的方式是将原始服务器数据映射到可观察的模型,所有计算变量都不是模型的一部分,但它们直接属于viewmodel。如果问题中包含更多的代码示例,也许我可以提供一些澄清?