我需要将ViewModel中主源的一些数据克隆到对话框中。原因是用户可以取消对话框,我不希望主人反映那些已取消的更改。
我将主数据的克隆副本创建到对话框中,并且数据绑定设置为拾取'localEdited。*'属性。如果用户单击“确定”,则我会尝试将数据保留回主服务器(如果已编辑),否则将数据推送到新数据中。
editItem: function(data) {
// clone a temporary copy for the dialog
this.localEdited = ko.mapping.fromJS(ko.toJS(data));
$("#dlgAdd").dialog("open");
},
上面当前有效,但是如果我单击主文件中的另一个项目,则对话框不会显示更新的值。就好像ko.mapping.fromJS只能工作一次然后再也不会。它总是拿起第一个值。我该如何解决这个问题?我觉得我需要重新绑定值,但KO的全部意义是不必这样做。
如何将数据保留回父级。我想我可能会遇到与上述相同的问题。
BTW,我正在使用KnockoutJS 1.2.1。
答案 0 :(得分:4)
localEdited需要是一个可观察的,你应该在this.localEdited(ko.mapping.fromJS(ko.toJS(data)))
函数中执行editItem
,以便每次调用editItem时敲门都会重新绑定对话框。对话框中的数据绑定需要更改为localEdited()。*
您可以在没有localEdited
可观察的情况下离开,但在这种情况下,您需要手动更新localEdited
函数中editItem
的每个可观察属性。所以你必须有像
this.localEdited.property1(data.property1());
this.localEdited.property2(data.property2());
关键是你需要使用函数调用语法更新observable。这种方式敲除将捕获更新并通过绑定传播它。在您的初始代码中,您只需对localEdited
进行简单的分配,因此淘汰赛没有钩子来拦截并发挥其魔力。
更新: 事实证明,ko.mapping插件可以自动更新模型中的各个可观察对象,因此您不必手动执行此操作:
ko.mapping.fromJS(ko.toJS(data), this.localEdited);