|
import * as util from '../util'; |
|
import * as is from '../is'; |
|
import get from 'lodash/get'; |
|
import set from 'lodash/set'; |
|
import toPath from 'lodash/toPath'; |
|
|
|
let define = { |
|
|
|
|
|
data: function( params ){ |
|
let defaults = { |
|
field: 'data', |
|
bindingEvent: 'data', |
|
allowBinding: false, |
|
allowSetting: false, |
|
allowGetting: false, |
|
settingEvent: 'data', |
|
settingTriggersEvent: false, |
|
triggerFnName: 'trigger', |
|
immutableKeys: {}, |
|
updateStyle: false, |
|
beforeGet: function( self ){}, |
|
beforeSet: function( self, obj ){}, |
|
onSet: function( self ){}, |
|
canSet: function( self ){ return true; } |
|
}; |
|
params = util.extend( {}, defaults, params ); |
|
|
|
return function dataImpl( name, value ){ |
|
let p = params; |
|
let self = this; |
|
let selfIsArrayLike = self.length !== undefined; |
|
let all = selfIsArrayLike ? self : [ self ]; |
|
let single = selfIsArrayLike ? self[0] : self; |
|
|
|
|
|
if (is.string(name)) { |
|
let isPathLike = name.indexOf('.') !== -1; |
|
let path = isPathLike && toPath(name); |
|
|
|
|
|
if( p.allowGetting && value === undefined ){ |
|
|
|
let ret; |
|
if( single ){ |
|
p.beforeGet( single ); |
|
|
|
|
|
if (path && single._private[ p.field ][ name ] === undefined) { |
|
ret = get(single._private[ p.field ], path); |
|
} else { |
|
ret = single._private[ p.field ][ name ]; |
|
} |
|
} |
|
return ret; |
|
|
|
|
|
} else if( p.allowSetting && value !== undefined ){ |
|
let valid = !p.immutableKeys[ name ]; |
|
if( valid ){ |
|
let change = { [name]: value }; |
|
|
|
p.beforeSet( self, change ); |
|
|
|
for( let i = 0, l = all.length; i < l; i++ ){ |
|
let ele = all[i]; |
|
|
|
if( p.canSet( ele ) ){ |
|
if (path && single._private[ p.field ][ name ] === undefined) { |
|
set(ele._private[ p.field ], path, value); |
|
} else { |
|
ele._private[ p.field ][ name ] = value; |
|
} |
|
} |
|
} |
|
|
|
|
|
if( p.updateStyle ){ self.updateStyle(); } |
|
|
|
|
|
p.onSet( self ); |
|
|
|
if( p.settingTriggersEvent ){ |
|
self[ p.triggerFnName ]( p.settingEvent ); |
|
} |
|
} |
|
} |
|
|
|
|
|
} else if( p.allowSetting && is.plainObject( name ) ){ |
|
let obj = name; |
|
let k, v; |
|
let keys = Object.keys( obj ); |
|
|
|
p.beforeSet( self, obj ); |
|
|
|
for( let i = 0; i < keys.length; i++ ){ |
|
k = keys[ i ]; |
|
v = obj[ k ]; |
|
|
|
let valid = !p.immutableKeys[ k ]; |
|
if( valid ){ |
|
for( let j = 0; j < all.length; j++ ){ |
|
let ele = all[j]; |
|
|
|
if( p.canSet( ele ) ){ |
|
ele._private[ p.field ][ k ] = v; |
|
} |
|
} |
|
} |
|
} |
|
|
|
|
|
if( p.updateStyle ){ self.updateStyle(); } |
|
|
|
|
|
p.onSet( self ); |
|
|
|
if( p.settingTriggersEvent ){ |
|
self[ p.triggerFnName ]( p.settingEvent ); |
|
} |
|
|
|
|
|
} else if( p.allowBinding && is.fn( name ) ){ |
|
let fn = name; |
|
self.on( p.bindingEvent, fn ); |
|
|
|
|
|
} else if( p.allowGetting && name === undefined ){ |
|
let ret; |
|
if( single ){ |
|
p.beforeGet( single ); |
|
|
|
ret = single._private[ p.field ]; |
|
} |
|
return ret; |
|
} |
|
|
|
return self; |
|
}; |
|
}, |
|
|
|
|
|
removeData: function( params ){ |
|
let defaults = { |
|
field: 'data', |
|
event: 'data', |
|
triggerFnName: 'trigger', |
|
triggerEvent: false, |
|
immutableKeys: {} |
|
}; |
|
params = util.extend( {}, defaults, params ); |
|
|
|
return function removeDataImpl( names ){ |
|
let p = params; |
|
let self = this; |
|
let selfIsArrayLike = self.length !== undefined; |
|
let all = selfIsArrayLike ? self : [ self ]; |
|
|
|
|
|
if( is.string( names ) ){ |
|
let keys = names.split( /\s+/ ); |
|
let l = keys.length; |
|
|
|
for( let i = 0; i < l; i++ ){ |
|
let key = keys[ i ]; |
|
if( is.emptyString( key ) ){ continue; } |
|
|
|
let valid = !p.immutableKeys[ key ]; |
|
if( valid ){ |
|
for( let i_a = 0, l_a = all.length; i_a < l_a; i_a++ ){ |
|
all[ i_a ]._private[ p.field ][ key ] = undefined; |
|
} |
|
} |
|
} |
|
|
|
if( p.triggerEvent ){ |
|
self[ p.triggerFnName ]( p.event ); |
|
} |
|
|
|
|
|
} else if( names === undefined ){ |
|
|
|
for( let i_a = 0, l_a = all.length; i_a < l_a; i_a++ ){ |
|
let _privateFields = all[ i_a ]._private[ p.field ]; |
|
let keys = Object.keys( _privateFields ); |
|
|
|
for( let i = 0; i < keys.length; i++ ){ |
|
let key = keys[i]; |
|
let validKeyToDelete = !p.immutableKeys[ key ]; |
|
|
|
if( validKeyToDelete ){ |
|
_privateFields[ key ] = undefined; |
|
} |
|
} |
|
} |
|
|
|
if( p.triggerEvent ){ |
|
self[ p.triggerFnName ]( p.event ); |
|
} |
|
} |
|
|
|
return self; |
|
}; |
|
}, |
|
}; |
|
|
|
export default define; |
|
|