KO Track Changes

KO Track changes of Observables and Mapped objects to check if isDirty

by lifetimelearner

JavaScript

;(function (ko) {
    ko.DirtyFlag = function (objectToTrack, objectName , isMapped, mappedKey ,isInitiallyDirty) {

        var self = this,
            _initialObject = objectToTrack,
            _initialObjectValue = _initialObject(),
            _persistentObject = ko.observable(objectToTrack),
            _persistentObjectValue = _persistentObject(),
            _objectName = objectName;

        var result = function () {
            self.isDirty = ko.computed(function () {
                return _initialObjectValue !== _persistentObjectValue();
            });
            self.changeDetails = function () {
                return _objectName + ' changed from ' + _initialObjectValue + ' to ' +  _persistentObjectValue() + '. ';
            };
            return self;
        };

        return result;
    };

    ko.DirtyFlagMapping = function (mappedToTrack, mappedFieldsToTrack) {
        var self = this,
            _objectName = mappedFieldsToTrack,
            _initialObjects = $.parseJSON('[' + ko.mapping.toJSON(mappedToTrack) + ']')[0],
            _persistentObjects = ko.observable(mappedToTrack());

        self.changeDetails = function () {
            return _objectName + ' changed from ' + _initialObjectValue + ' to ' +  _persistentObjectValue() + '. ';
        };
        self.outputObjectValues = function () {
            return _initialValue;
        };

        var result = function () {
            self.isDirty = function () {
                var dirtyResult = false;
                for (var i = 0; i < self.initObj().length; i++)
                {
                    $.each(_objectName, function (index, name){
                        if (result || _initialObjects[i][name.toString()] != _persistentObjects()[i][name.toString()]())
                        {
                            dirtyResult = true;
                        }
                    });
                }
                return dirtyResult;
            };
        };

        return...