Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/458.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript KnockoutJS:使用映射更新/插入数据到viewModel_Javascript_Knockout.js_Knockout Mapping Plugin - Fatal编程技术网

Javascript KnockoutJS:使用映射更新/插入数据到viewModel

Javascript KnockoutJS:使用映射更新/插入数据到viewModel,javascript,knockout.js,knockout-mapping-plugin,Javascript,Knockout.js,Knockout Mapping Plugin,我想弄清楚这件事已经有一段时间了。我找不到任何解决这个问题的方法,但是如果我错了,请纠正我 问题是: 我有来自JSON API的数据,带有嵌套的数组/对象结构。我使用映射最初用我的数据填充模型。为了更新这个,我想在新数据到达时扩展模型,或者更新现有数据 据我所知,mapping option键应该可以为我实现这一点,但我可能误解了mapping选项的功能 我已经总结了这个例子所代表的问题: var用户映射={ 关键:功能(项目){ 返回不可拆卸的物料(物料id); } }; //用值替换JSON

我想弄清楚这件事已经有一段时间了。我找不到任何解决这个问题的方法,但是如果我错了,请纠正我

问题是: 我有来自JSON API的数据,带有嵌套的数组/对象结构。我使用映射最初用我的数据填充模型。为了更新这个,我想在新数据到达时扩展模型,或者更新现有数据

据我所知,mapping option键应该可以为我实现这一点,但我可能误解了mapping选项的功能

我已经总结了这个例子所代表的问题:

var用户映射={
关键:功能(项目){
返回不可拆卸的物料(物料id);
}
};
//用值替换JSON调用
var viewModel={
用户:ko.mapping.fromJS([],userMapping)
};
//应该插入新的-新的ID吗?
fromJS([{“id”:1,“name”:“Foo”},{“id”:2,“name”:“Bar”}),userMapping,viewModel.users);
//应该只更新ID#1-相同的ID吗?
fromJS([{“id”:1,“name”:“Bat”}],userMapping,viewModel.users);
//应该插入新的-新的ID吗?
fromJS([{“id”:3,“name”:“New”},{“id”:4,“name”:“New”}],userMapping,viewModel.users);
应用绑定(视图模型);​
小提琴:

如您所见,第一行插入数据。一切都好。但当我尝试更新时,它会替换内容。第三种映射也是如此;它替换内容,而不是扩展内容

我用错了吗?在使用映射之前,是否应该尝试“手动”扩展内容

编辑解决方案:
我通过使用第二个助手数组存储所有当前模型解决了这个问题。在新数据上,我扩展了这个数组,并更新了视图模型以包含累积的项


更新时(在我的例子中是WebSocket消息),我循环遍历模型,更改相关项的内容,并使用方法valueHasMutated()将更改的值通知敲除库

是的,您应该首先将所有数据收集到一个列表或数组中,然后将映射应用到该列表。否则,您将覆盖viewModel中的值。

您可以使用
ko.mapping.updateFromJS()
更新现有值。但是,它不会添加新值,因此在您的实例中这将是一个问题。有关更多详细信息,请查看下面的链接


通过查看示例代码,映射插件的行为与我预期的完全一致。在集合上调用
fromJS
时,实际上是在告诉映射插件这是该集合的新内容。例如:

在第二行,它怎么知道你是在更新还是只是删除了id:2

我找不到任何合适的方法,将数据视为简单的更新,尽管您可以添加一个。映射数组附带了一些有用的方法,例如
mappedIndexOf
,以帮助您查找特定项。如果收到一个更新数据集,只需在其中循环,找到该项并使用对该特定项的mapping.fromJS调用对其进行更新。这很容易推广到可重用方法中。

updateFromJS()方法于2011年8月被删除。对此有何想法: