Simple ES Javascript Plugin for Data Manager & Observer (Single state of truth)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
window.DataManager = { | |
setData: function ( data ) { | |
if ( typeof data !== 'object' ) { | |
throw new Error( 'Only accept object!' ); | |
} | |
var hashPrevData = JSON.stringify( DataManager.data ); | |
var hashData = JSON.stringify( data ); | |
if ( hashPrevData !== hashData ) { | |
DataManager._prevData = _.cloneDeep( DataManager._data ); | |
DataManager._data = _.merge( DataManager.data, data ); | |
for ( var i in DataManager.observer ) { | |
var observeCallback = DataManager.observer[ i ]; | |
observeCallback( DataManager.data, DataManager.prevData ); | |
} | |
} | |
}, | |
get data() { | |
return DataManager._data; | |
}, | |
get prevData() { | |
return DataManager._prevData; | |
}, | |
set observer( callback ) { | |
if ( typeof callback !== 'function' ) { | |
throw new Error( 'Only accept function!' ); | |
} | |
DataManager._observers.push( callback ); | |
}, | |
get observer() { | |
return DataManager._observers; | |
}, | |
_observers: [], | |
_data: {}, | |
_prevData: {} | |
}; | |
// Example register `observer` callback | |
DataManager.observer = function( data, prev ) { | |
// example usage with previous data | |
if ( prev.name ) { | |
console.log( 'Bye ' + prev.name + '!' ); | |
} | |
console.log( 'Hello ' + data.name + '!' ); | |
}; | |
// Example set data | |
DataManager.setData( { name: 'Syaiful' } ); | |
// Hello Syaiful! | |
// Example set data and use previous data | |
DataManager.setData( { name: 'Arifah' } ); | |
// Bye Syaiful! | |
// Hello Arifah! |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment