Knockout.js 如何使用敲除映射克隆和重新绑定数据?

Knockout.js 如何使用敲除映射克隆和重新绑定数据?,knockout.js,knockout-mapping-plugin,Knockout.js,Knockout Mapping Plugin,我需要将ViewModel中主源的一些数据克隆到对话框中。原因是用户可以取消对话框,我不想让主界面反映那些取消的更改 我在对话框中创建了主数据的克隆副本,并且数据绑定设置为拾取“localEdited.*”属性。如果用户单击“确定”,则我会尝试将数据保存回主数据(如果已编辑),否则会推送数据(如果是新数据) editItem: function(data) { // clone a temporary copy for the dialog

我需要将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的全部目的是不必这么做

如何将数据持久化回父级。我想我可能有和上面一样的问题


顺便说一句,我正在使用knockoutjs1.2.1。

localEdited需要是一个可观察的,你应该这样做。
localEdited(ko.mapping.fromJS(ko.toJS(data)))
editItem
函数中使knockout在每次调用editItem时重新绑定你的对话框。对话框中的数据绑定需要更改为localEdited()*

您可以在
localEdited
不可见的情况下离开,但在这种情况下,您需要手动更新
editItem
函数中
localEdited
的每个可见属性。所以你必须有这样的东西

this.localEdited.property1(data.property1());
this.localEdited.property2(data.property2());
关键是您需要使用函数调用语法来更新可观察对象。这样,knockout将捕获更新并通过绑定传播它。在初始代码中,您只需对
localEdited
进行简单赋值,这样knockout就不会有钩子来截取并发挥其魔力

更新: 事实证明,ko.mapping插件可以自动更新模型中的单个观测值,因此您不必手动进行更新:

ko.mapping.fromJS(ko.toJS(data), this.localEdited);

好的,谢谢你。为什么包装器“localEdited”本身必须是可观察的,而所有单独的属性都是可观察的?您可以在localEdited不可观察的情况下离开,但在这种情况下,您需要在editItem函数中手动更新localEdited的每个可观察属性。因此,您必须具有类似这样的内容。localEdited.property1(data.property1());this.localEdited.property2(data.property2());好吧,我现在明白了,当每个作业都需要对UI进行更新时,knockout需要某种方式知道。在这种情况下,可观察的赋值就是钩子。如果我明白了,我知道这是一个很好的解释!