Creating a smart, dirty flag
http://www.knockmeout.net/2011/05/creating-smart-dirty-flag-in-knockoutjs.html
by WizKid81
HTML
<script src="http://knockoutjs.com/downloads/knockout-2.2.0.js"></script>
<ul data-bind="foreach: items">
<li data-bind="css: { dirty: dirtyFlag.isDirty }">
<span data-bind="text: id"></span>
<input data-bind="value: name" />
<button data-bind="click: dirtyFlag.reset">Reset</button>
</li>
</ul>
<button data-bind="enable: isDirty, click: save">Save</button>
<hr />
<h3>Just Dirty Items</h3>
<div data-bind="text: ko.toJSON(dirtyItems)"></div>
CSS
li { padding: 2px; margin: 2px; }
input { width: 75px; }
.dirty { border: solid yellow 2px; }
JavaScript
//////////////////
ko.subscribable.fn.trackDirtyArrayFlag = function () {
var original = this();
this.isDirty = ko.computed(function () {
console.log("Checking if an array is dirty.");
console.log(this().length)
//If there are a different number of elements
return false;
}, this);
this.revert = function () {
this(original);
//return;
};
this.update = function () {
original = this();
//return;
}
this.startingValue = function () {
console.log("startingValue");
};
return this;
};
/////////////////////////////////
var hierarchyNode = function (data, parent) {
var self = this;
getObservableArray = function (childNodes) {
var returnArray = ko.observableArray().trackDirtyArrayFlag();
$(childNodes).each(function (index, element) {
var hierarchyItem = new hierarchyNode(element, self);
returnArray.push(hierarchyItem);
})
return returnArray;
}
this.id_field = (data === null || data === undefined || typeof data.ID_Field === "undefined") ? undefined : data.ID_Field;
this.parent_id = (data === null || data === undefined || typeof data.Parent_ID === "undefined") ? undefined : data.Parent_ID;
this.name = (data === null || data === undefined || typeof data.Name === "undefined") ? undefined : ko.observable(data.Name).trackDirtyFlag();
this.hasChildren = (data === null || data === undefined || typeof data.HasChildren === "undefined") ? ko.observable(false) : data.HasChildren == 1 ? ko.observable(true) : ko.observable(false);
this.childNodes = (data === null || data ===...