KO Track Changes

Latest/Working KO track changes

by lifetimelearner

JavaScript

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

        var result = function () {
            self.isDirty = ko.computed(function () {
                var dirtyResult = false;
                _persistentChanges.removeAll();
                
                for (var i = 0; i < _initialObjects.length; i++)
                {
                    $.each(_objectName, function (index, name){
                        var fieldTracked = name.toString(),
                            type = _persistentObjects()[i][objectTypeToTrack](),
                            originalValue = _initialObjects[i][fieldTracked],
                            updatedValue = _persistentObjects()[i][fieldTracked]();

                        if (originalValue != updatedValue)
                        {
                            self.outputChanges(type, fieldTracked, originalValue, updatedValue);
                            dirtyResult = true;
                        }
                    });
                }
                return dirtyResult;
            });
            self.outputChanges = function (type, fieldUpdated , originalValue, updatedValue) {
                if ($.trim(type) != '' && type != null)
                {
                    _persistentChanges.push(type + '-' + fieldUpdated + ' changed from ' + originalValue + ' to ' + updatedValue + '. ');
                }
                return _persistentChanges();
            };
            self.changes = function ( ){
                return _persistentChanges;
            };
            return self;
        };
        return result;
    };
})(ko);