在这里查看JsFiddle http://jsfiddle.net/WtgbV/2/
用语言:我有一些ajax调用,并且在服务器的响应中我获得了一些项目数组(knockout viewmodel中的项目)
我需要知道在name
等元素中更改了属性id==2
,以便在服务器上自动保存更改(通过POST请求)
跟踪Items
数组中每个元素的变化的最简单/最简单的方法是什么?
答案 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和其他核心元素使用)。
您可以通过扩展每个属性来使用此系统,以便在编辑后在特定主题上发布事件。
然后,您需要订阅此主题,以便跟踪数据中的更改。
您可以通过提供自己的映射轻松实现此目的。以下是一个非常基本的示例,只是为了向您展示PubSub系统可以为您做什么。 See example
如果我可以给你一个提示,那么最好不要保存每个属性,而是检测更改并在一段时间后对整个数组进行自动保存。
因此,每个值都会在主题上发布“更改事件”,并且每次收到有关主题的消息时,timeOut都将被重置。超时到期后,您可以保存BE中的更改。