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