update settings object merging

This commit is contained in:
Georg Fischer 2016-01-13 17:09:54 +01:00
parent a6ba156c38
commit 9e04379d9c
2 changed files with 48 additions and 11 deletions

View File

@ -70,6 +70,8 @@ define(
function save ( newSettings ) {
if ( useLocalForage ) {
newSettings = getValidSettings( newSettings );
if ( worker ) {
sendMessageToWorker( 'save', newSettings );
} else {
@ -142,24 +144,29 @@ define(
if ( newSettings ) {
settings = newSettings || defaultSettings;
if ( settings !== defaultSettings ) {
for ( var name in defaultSettings ) {
if ( ! settings[name] ) {
settings[name] = defaultSettings[name];
}
}
}
if ( objectHelper.isEqual( getValidSettings( settings ), settings ) ) {
for ( var name in settings ) {
publishers.update.dispatch( name, settings[name].value, settings[name].options );
}
} else {
save( getValidSettings( settings ) );
}
} else {
settings = defaultSettings;
save( settings );
}
}
function getValidSettings ( settings ) {
if ( settings&& defaultSettings && settings !== defaultSettings ) {
settings = objectHelper.merge( settings, defaultSettings );
}
return settings;
}
self.getSetting = getSetting;
self.getSettingValue = getSettingValue;
self.getSettings = getSettings;

View File

@ -27,9 +27,39 @@ define(
return JSON.parse( JSON.stringify( obj ) );
}
function isEqual ( obj1, obj2 ) {
return JSON.stringify( obj1 ) === JSON.stringify( obj2 );
}
// http://stackoverflow.com/a/383245/229189
// add missing properties from obj2
function merge ( obj1, obj2 ) {
obj1 = getCopy( obj1 );
obj2 = getCopy( obj2 );
for ( var p in obj2 ) {
try {
// Property in destination object set; update its value.
if ( typeof obj2[p] === 'object' ) {
obj1[p] = merge( obj1[p], obj2[p] );
} else {
if ( typeof obj1[p] === 'undefined' && typeof obj2[p] !== 'undefined' ) {
obj1[p] = obj2[p];
}
}
} catch ( e ) {
obj1[p] = obj2[p];
}
}
return obj1;
}
return {
getObjectByString: getObjectByString,
getCopy: getCopy
getCopy: getCopy,
merge: merge,
isEqual: isEqual
};
}
);