You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
68 lines
1.9 KiB
68 lines
1.9 KiB
3 years ago
|
import isEmpty from './isEmpty'
|
||
|
import debounce from './debounce'
|
||
|
|
||
|
/**
|
||
|
* bind func to obj
|
||
|
*/
|
||
|
function bindFunc(obj, method, observer) {
|
||
|
const oldFn = obj[method]
|
||
|
obj[method] = function(target) {
|
||
|
if (observer) {
|
||
|
observer.call(this, target, {
|
||
|
[method]: true,
|
||
|
})
|
||
|
}
|
||
|
if (oldFn) {
|
||
|
oldFn.call(this, target)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// default methods
|
||
|
const methods = ['linked', 'linkChanged', 'unlinked']
|
||
|
|
||
|
// extra props
|
||
|
const extProps = ['observer']
|
||
|
|
||
|
export default Behavior({
|
||
|
lifetimes: {
|
||
|
created() {
|
||
|
this._debounce = null
|
||
|
},
|
||
|
detached() {
|
||
|
if (this._debounce && this._debounce.cancel) {
|
||
|
this._debounce.cancel()
|
||
|
}
|
||
|
},
|
||
|
},
|
||
|
definitionFilter(defFields) {
|
||
|
const { relations } = defFields
|
||
|
|
||
|
if (!isEmpty(relations)) {
|
||
|
for (const key in relations) {
|
||
|
const relation = relations[key]
|
||
|
|
||
|
// bind func
|
||
|
methods.forEach((method) => bindFunc(relation, method, relation.observer))
|
||
|
|
||
|
// delete extProps
|
||
|
extProps.forEach((prop) => delete relation[prop])
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Object.assign(defFields.methods = (defFields.methods || {}), {
|
||
|
getRelationsName: function(types = ['parent', 'child', 'ancestor', 'descendant']) {
|
||
|
return Object.keys(relations || {}).map((key) => {
|
||
|
if (relations[key] && types.includes(relations[key].type)) {
|
||
|
return key
|
||
|
}
|
||
|
return null
|
||
|
}).filter((v) => !!v)
|
||
|
},
|
||
|
debounce: function(func, wait = 0, immediate = false) {
|
||
|
return (this._debounce = this._debounce || debounce(func.bind(this), wait, immediate)).call(this)
|
||
|
},
|
||
|
})
|
||
|
},
|
||
|
})
|