无法使用新数据对象更新Knockout UI
Cannot update Knockout UI with fresh data object
当我从服务器获取单个项目的新数据时,我当前在UI刷新方面遇到问题,该项目位于包装对象的observableArray中,该包装对象包含多个observables的对象。
考虑以下内容:
var vm = {
....
localEdited: ko.mapping.fromJS(new ItemWrapper(defaultModelSerialised)),
selected: ko.observable(null),
editItem: function(data) {
// clone a temporary copy of data for the dialog when opening (*.localEdited on dialog)
var clonedData = ko.toJS(data);
ko.mapping.fromJS(clonedData, null, this.localEdited);
// selected should now point to the item in the obserable array which will be refreshed
this.selected(data);
// open dialog...
},
submitDialog: function(data) {
// submit data to server...
// (1) commit the data back to UI (new item is return in resp.entity from server)
vm.selected(new ItemWrapper(resp.entity));
// at this point the UI isn't showing the updated value
// (2) however if I do this it reflects the data change in the UI
this.selected().Name("changed"); // updates the UI.
}
有人能解释一下为什么将ItemWrapper传递到vm.selected中不会更新UI,而在(2)中它是有效的吗。我不想像(2)中那样为每个属性设置每个属性。
ItemWrapper看起来是这样的:
function PoolWrapper(pool) {
this.Name = ko.observable(pool.Name);
// more properties...
}
OK-问题是克隆最终会映射元数据,最终在尝试调用ko.mapping.fromJS
时会导致递归。
解决方案是使用ko.mapping.toJS
而不是ko.toJS
创建克隆,这样您就可以获得一个干净的克隆(无需映射元数据)。
这是一个更新的小提琴:http://jsfiddle.net/rniemeyer/tDDBp/
我今天也偶然发现了一些我想分享的东西:
如果使用进行克隆
var clone = ko.mapping.fromJS(ko.mapping.toJS(itemToClone));
然后,克隆将被剥夺任何计算的可观察性。它们将作为函数的最后一个值存在,但不再作为计算的可观测值。
如果你的物品是一个复杂的模型,有计算的可观察性,你想保留在你的克隆上,你可以做以下事情:
var clone = ko.mapping.fromJS(ko.mapping.toJS(itemToClone), null, new itemModel());
其中itemModel是包含计算的可观察性的项目的复杂模型。
相关文章:
- 从knockout.js中的另一个对象更新一个深度结构化的javascript对象
- Meteor使用对象更新集合
- 如何使用不同视图的JSON对象更新angular js中的全局JSON字段
- 流星反应式嵌套对象更新父对象
- 从返回的 MongoDB 对象更新 Angular.js $scoped
- 在节点 JS 中将值从一个对象更新到另一个对象
- 使用循环从另一个对象更新对象
- React未从数组内的对象更新属性
- 可以't使用新对象更新localStorage
- 使用MongoDB,如何使用变量中的对象更新数组中的对象
- 从用PHP脚本创建的json对象更新速度表数据
- mongoDB-使用$set和一个对象更新文档
- 无法使用新数据对象更新Knockout UI
- 通过REST端点用JSON对象更新Mongoose架构
- 变量引用对象的值,但在对象更新时不更新
- 如何使用jq命令行实用程序执行JSON对象更新
- ReactJS皮质对象更新渲染未调用
- 如何使用json对象更新dojo网格
- 使用接收到的对象更新css设置
- 只有一些我的解析对象更新(总是9,但没有更多),当我运行这个javascript解析云代码