3

我需要将 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 的全部意义在于不必这样做。

我如何也将数据保留回父级。我想我可能有和上面一样的问题。

顺便说一句,我正在使用 KnockoutJS 1.2.1。

4

1 回答 1

4

localEdited 必须是可观察的,并且您应该this.localEdited(ko.mapping.fromJS(ko.toJS(data)))editItem每次调用 editItem 时使淘汰赛重新绑定您的对话框。对话框中的数据绑定将需要更改为 localEdited().*

您可以在不被观察的情况下逃脱localEdited,但在这种情况下,您将需要手动更新localEditedineditItem函数的每个可观察属性。所以你必须有类似的东西

this.localEdited.property1(data.property1());
this.localEdited.property2(data.property2());

关键是您需要使用函数调用语法更新 observables。这样淘汰赛将捕获更新并通过绑定传播它。在您的初始代码中,您只需对 进行简单的分配localEdited,因此淘汰赛没有拦截并发挥其魔力的钩子。

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

ko.mapping.fromJS(ko.toJS(data), this.localEdited);
于 2012-02-09T17:09:41.867 回答