コードにはいくつかの問題があります。
関数でを定義しdirtyFlag
ていますTask
。ただし、viewModelインスタンスにバインドされたビューでチェックしています。
データをロードした後にダーティフラグを定義するか、を呼び出す必要がありますdirtyFlag().reset()
。
isDirty
計算されます。かっこで呼び出す必要があります。
ビューモデルは次のようになります。
function TaskListViewModel() {
// Data
function Task(data) {
this.title = ko.observable(data.title);
this.isDone = ko.observable(data.isDone);
}
var self = this;
self.tasks = ko.observableArray([]);
self.newTaskText = ko.observable();
self.incompleteTasks = ko.computed(function() {
return ko.utils.arrayFilter(self.tasks(), function(task) { return !task.isDone() && !task._destroy });
});
this.dirtyFlag = new ko.DirtyFlag(this.isDone);
// Operations
self.addTask = function() {
self.tasks.push(new Task({ title: this.newTaskText() }));
self.newTaskText("");
};
self.removeTask = function(task) { self.tasks.destroy(task) };
self.save = function() {
$.ajax("/echo/json/", {
data: {
json: ko.toJSON({
tasks: this.tasks
})
},
type: "POST",
dataType: 'json',
success: function(result) {
self.dirtyFlag().reset();
alert(ko.toJSON(result))
}
});
};
//Load initial state from server, convert it to Task instances, then populate self.tasks
$.ajax("/echo/json/", {
data: {
json: ko.toJSON(fakeData)
},
type: "POST",
dataType: 'json',
success: function(data) {
var mappedTasks = $.map(data, function(item) {
return new Task(item);
});
self.tasks(mappedTasks);
self.dirtyFlag().reset();
}
});
}
キャンセルボタンのバインド:
<button data-bind="enable: dirtyFlag().isDirty()">Cancel</button>
そして、作業中のフィドル(あなたのフォーク)は次の場所にあります:http://jsfiddle.net/delixfe/ENZsG/6/