0

在此处查看 JsFiddle http://jsfiddle.net/WtgbV/2/

换句话说:我有一些 ajax 调用,并且在服务器的响应中我得到了一些项目数组(淘汰视图模型中的项目)

我需要知道name元素中的属性已更改为id==2etc 以在服务器上自动保存更改(通过 POST 请求)

Items跟踪数组 中每个元素的变化的最简单/最简单的方法是什么?

4

2 回答 2

3

我与人共同编写了一个名为 DirtyFlag 的组件,用于检测 Knockout observables(或其中一组)的变化。你可以从我的名为 KoLite 的库中获取,你可以从 NuGet 或 GitHub 获取。

https://github.com/CodeSeven/KoLite

https://nuget.org/packages/KoLite

脏标志

// Your model
var Person = function () {
    var self = this;
    self.id = ko.observable();
    self.firstName = ko.observable().extend({ required: true });
    self.lastName = ko.observable().extend({ required: true });
    self.dirtyFlag = new ko.DirtyFlag([self.firstName,self.lastName]);
    return self;
};

将这些挂钩到您的视图模型中以检测是否有更改...

//Property on your view model. myPerson is an instance of Person.
//Did it Change?
isDirty = ko.computed(function () {
    return myPerson().dirtyFlag().isDirty();
}),

然后重新同步更改...

//Resync Changes
dirtyFlag().reset();
于 2012-09-14T16:23:20.793 回答
0

Knockout 有一个内置的 PubSub 系统(由他们的 observables 和其他核心元素使用)。

您可以通过扩展每个属性以在编辑后发布有关特定主题的事件来利用此系统。

然后,您需要订阅此主题,以便跟踪数据的更改。

看看这个优秀的帖子

您可以通过提供自己的映射轻松实现此目的。以下是一个非常基本的示例,只是为了向您展示 PubSub 系统可以为您做什么。见例子

如果我可以给你一个提示,最好不要保存每个属性,而是检测更改并在一段时间后自动保存整个数组。

因此,每个值都会在主题上发布一个“更改事件”,并且每次您收到有关主题的消息时,timeOut 都会被重置。超时到期后,您可以在 BE 中保存更改。

于 2012-09-14T11:13:26.757 回答