Javascript 淘汰:编辑数据,轻松回滚到上一个值

Javascript 淘汰:编辑数据,轻松回滚到上一个值,javascript,knockout.js,Javascript,Knockout.js,有很多关于在Knockout中编辑数据的博客帖子和讨论。 我遇到的主要问题是,当用户取消编辑操作(或Ajax调用出错)时,需要一种简单的方法将数据恢复到以前的值 我对我发现的例子并不满意:即使在编辑非常复杂的模型时,我也需要一些非常简单的东西。这是我发现的解决方案,我分享它是为了从比我更专业的人那里了解可能存在的缺点,当然也是为了提供帮助 单击“编辑”按钮时,我将创建正在编辑的数据的副本 编辑按钮(即:在具有foreach绑定的表的每一行上) 当用户单击“取消”按钮或用于更新服务器的AJAX调用

有很多关于在Knockout中编辑数据的博客帖子和讨论。 我遇到的主要问题是,当用户取消编辑操作(或Ajax调用出错)时,需要一种简单的方法将数据恢复到以前的值


我对我发现的例子并不满意:即使在编辑非常复杂的模型时,我也需要一些非常简单的东西。

这是我发现的解决方案,我分享它是为了从比我更专业的人那里了解可能存在的缺点,当然也是为了提供帮助

单击“编辑”按钮时,我将创建正在编辑的数据的副本

编辑按钮(即:在具有foreach绑定的表的每一行上)

当用户单击“取消”按钮或用于更新服务器的AJAX调用失败时,我会从“缓存”中复制数据,可观察到:

this.cancelEditItem = function () {
    for (var prop in self.selectedItem) {
        if (typeof self.selectedItem[prop] === 'function') {
            self.selectedItem[prop](self.selectedItemCache()[prop]);
        }
    }
}

我同意Nicola的回答,这种方法是最流行的方法

我用过这个方法,这是一个相当完美的方法。它在我的应用程序中运行得很好。

Ryan Niemeyer的“充分利用Knockout.js”屏幕广播包含了一个很好的方法(以及大量其他有用的提示)-我建议您查看它

他谈到16:30左右复出

this.selectedItem = ko.observable();
this.selectedItemCache = ko.observable();
this.editItem = function (item) {
    self.selectedItem (item);
    self.selectedItemCache (ko.mapping.toJS(item)); // ko.mapping.toJS "detach" my item from the view model
}
this.cancelEditItem = function () {
    for (var prop in self.selectedItem) {
        if (typeof self.selectedItem[prop] === 'function') {
            self.selectedItem[prop](self.selectedItemCache()[prop]);
        }
    }
}