Knockoutjs在ajax调用后跟踪更改

时间:2012-09-14 10:29:36

标签: javascript knockout.js knockout-mapping-plugin kolite

在这里查看JsFiddle http://jsfiddle.net/WtgbV/2/

用语言:我有一些ajax调用,并且在服务器的响应中我获得了一些项目数组(knockout viewmodel中的项目)

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

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

2 个答案:

答案 0 :(得分:3)

我共同编写了一个名为DirtyFlag的组件,用于检测Knockout observable(或其中一组)中的更改。您可以从我的库KoLite中获取您可以抓取NuGet或GitHub。

https://github.com/CodeSeven/KoLite

https://nuget.org/packages/KoLite

<强> dirtyFlag

// 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;
};

将这些连接到您的viewmodel以检测是否有更改...

//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();

答案 1 :(得分:0)

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

您可以通过扩展每个属性来使用此系统,以便在编辑后在特定主题上发布事件。

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

查看this excellent post

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

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

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