forked from fanruan/fineui
Zhenfei.Li
2 years ago
18 changed files with 2591 additions and 2598 deletions
@ -1,220 +1,221 @@ |
|||||||
!(function () { |
import BI from "./2.base"; |
||||||
function extend() { |
|
||||||
var target = arguments[0] || {}, length = arguments.length, i = 1, options, name, src, copy; |
function extend() { |
||||||
for (; i < length; i++) { |
let target = arguments[0] || {}, length = arguments.length, i = 1, name, copy; |
||||||
// Only deal with non-null/undefined values
|
for (; i < length; i++) { |
||||||
if ((options = arguments[i]) != null) { |
// Only deal with non-null/undefined values
|
||||||
// Extend the base object
|
const options = arguments[i]; |
||||||
for (name in options) { |
if (options !== null) { |
||||||
src = target[name]; |
// Extend the base object
|
||||||
copy = options[name]; |
for (name in options) { |
||||||
|
copy = options[name]; |
||||||
// Prevent never-ending loop
|
|
||||||
if (target === copy) { |
// Prevent never-ending loop
|
||||||
continue; |
if (target === copy) { |
||||||
} |
continue; |
||||||
|
} |
||||||
|
|
||||||
if (copy !== undefined) { |
|
||||||
target[name] = copy; |
if (copy !== undefined) { |
||||||
} |
target[name] = copy; |
||||||
} |
} |
||||||
} |
} |
||||||
} |
} |
||||||
return target; |
|
||||||
} |
} |
||||||
|
|
||||||
/** |
return target; |
||||||
* 客户端观察者,主要处理事件的添加、删除、执行等 |
} |
||||||
* @class BI.OB |
|
||||||
* @abstract |
|
||||||
*/ |
|
||||||
var OB = function (config) { |
|
||||||
this._constructor(config); |
|
||||||
}; |
|
||||||
BI._.extend(OB.prototype, { |
|
||||||
props: {}, |
|
||||||
|
|
||||||
init: null, |
export default class OB { |
||||||
|
// props = {};
|
||||||
|
|
||||||
destroyed: null, |
// init = null;
|
||||||
|
|
||||||
_constructor: function (config) { |
// destroyed = null;
|
||||||
this._initProps(config); |
|
||||||
this._init(); |
|
||||||
this._initRef(); |
|
||||||
}, |
|
||||||
|
|
||||||
_defaultConfig: function (config) { |
constructor(config) { |
||||||
return {}; |
this._constructor(config); |
||||||
}, |
} |
||||||
|
|
||||||
_initProps: function (config) { |
_constructor(config) { |
||||||
var props = this.props; |
this._initProps(config); |
||||||
if (BI.isFunction(this.props)) { |
this._init(); |
||||||
props = this.props(config); |
this._initRef(); |
||||||
} |
} |
||||||
var defaultProps = extend(this._defaultConfig(config), props); |
|
||||||
var modifiedDefaultProps = (config && config.type && BI.OB.configFunctions[config.type + ".props"]) ? BI.reduce(BI.OB.configFunctions[config.type + ".props"], function (value, conf, index) { |
|
||||||
return extend(conf, value.fn(defaultProps, config, value.opt)); |
|
||||||
}, {}) : null; |
|
||||||
this.options = extend(defaultProps, modifiedDefaultProps, config); |
|
||||||
}, |
|
||||||
|
|
||||||
_init: function () { |
|
||||||
this._initListeners(); |
|
||||||
this.init && this.init(); |
|
||||||
}, |
|
||||||
|
|
||||||
_initListeners: function () { |
|
||||||
var self = this; |
|
||||||
if (this.options.listeners != null) { |
|
||||||
BI._.each(this.options.listeners, function (lis, eventName) { |
|
||||||
if (BI._.isFunction(lis)) { |
|
||||||
self.on(eventName, lis); |
|
||||||
return; |
|
||||||
} |
|
||||||
if (BI._.isArray(lis)) { |
|
||||||
BI._.each(lis, function (l) { |
|
||||||
self.on(eventName, l); |
|
||||||
}); |
|
||||||
return; |
|
||||||
} |
|
||||||
(lis.target ? lis.target : self)[lis.once ? "once" : "on"](lis.eventName, BI._.bind(lis.action, self)); |
|
||||||
}); |
|
||||||
delete this.options.listeners; |
|
||||||
} |
|
||||||
}, |
|
||||||
|
|
||||||
// 获得一个当前对象的引用
|
_defaultConfig(config) { |
||||||
_initRef: function () { |
return {}; |
||||||
var o = this.options; |
} |
||||||
if (o.__ref) { |
|
||||||
BI.isFunction(o.__ref) ? o.__ref.call(this, this) : o.__ref.current = this; |
|
||||||
} |
|
||||||
if (o.ref) { |
|
||||||
BI.isFunction(o.ref) ? o.ref.call(this, this) : o.ref.current = this; |
|
||||||
} |
|
||||||
}, |
|
||||||
|
|
||||||
//释放当前对象
|
|
||||||
_purgeRef: function () { |
|
||||||
var o = this.options; |
|
||||||
if (o.__ref) { |
|
||||||
BI.isFunction(o.__ref) ? o.__ref.call(null, null) : o.__ref.current = null; |
|
||||||
o.__ref = null; |
|
||||||
} |
|
||||||
if (o.ref) { |
|
||||||
BI.isFunction(o.ref) ? o.ref.call(null, null) : o.ref.current = null; |
|
||||||
o.ref = null; |
|
||||||
} |
|
||||||
}, |
|
||||||
|
|
||||||
_getEvents: function () { |
_initProps(config) { |
||||||
if (!BI._.isObject(this.events)) { |
let props = this.props; |
||||||
this.events = {}; |
if (BI.isFunction(this.props)) { |
||||||
} |
props = this.props(config); |
||||||
return this.events; |
} |
||||||
}, |
const defaultProps = extend(this._defaultConfig(config), props); |
||||||
|
const modifiedDefaultProps = (config && config.type && OB.configFunctions[config.type + ".props"]) ? BI.reduce(OB.configFunctions[config.type + ".props"], function (value, conf, index) { |
||||||
/** |
return extend(conf, value.fn(defaultProps, config, value.opt)); |
||||||
* 给观察者绑定一个事件 |
}, {}) : null; |
||||||
* @param {String} eventName 事件的名字 |
this.options = extend(defaultProps, modifiedDefaultProps, config); |
||||||
* @param {Function} fn 事件对应的执行函数 |
} |
||||||
*/ |
|
||||||
on: function (eventName, fn) { |
_init() { |
||||||
var self = this; |
this._initListeners(); |
||||||
eventName = eventName.toLowerCase(); |
this.init && this.init(); |
||||||
var fns = this._getEvents()[eventName]; |
} |
||||||
if (!BI._.isArray(fns)) { |
|
||||||
fns = []; |
_initListeners() { |
||||||
this._getEvents()[eventName] = fns; |
if (this.options.listeners !== null) { |
||||||
} |
BI._.each(this.options.listeners, (lis, eventName) => { |
||||||
fns.push(fn); |
if (BI._.isFunction(lis)) { |
||||||
|
this.on(eventName, lis); |
||||||
return function () { |
|
||||||
self.un(eventName, fn); |
return; |
||||||
}; |
} |
||||||
}, |
if (BI._.isArray(lis)) { |
||||||
|
BI._.each(lis, (l) => { |
||||||
/** |
this.on(eventName, l); |
||||||
* 给观察者绑定一个只执行一次的事件 |
|
||||||
* @param {String} eventName 事件的名字 |
|
||||||
* @param {Function} fn 事件对应的执行函数 |
|
||||||
*/ |
|
||||||
once: function (eventName, fn) { |
|
||||||
var proxy = function () { |
|
||||||
fn.apply(this, arguments); |
|
||||||
this.un(eventName, proxy); |
|
||||||
}; |
|
||||||
this.on(eventName, proxy); |
|
||||||
}, |
|
||||||
|
|
||||||
/** |
|
||||||
* 解除观察者绑定的指定事件 |
|
||||||
* @param {String} eventName 要解除绑定事件的名字 |
|
||||||
* @param {Function} fn 事件对应的执行函数,该参数是可选的,没有该参数时,将解除绑定所有同名字的事件 |
|
||||||
*/ |
|
||||||
un: function (eventName, fn) { |
|
||||||
eventName = eventName.toLowerCase(); |
|
||||||
|
|
||||||
/* alex:如果fn是null,就是把eventName上面所有方法都un掉*/ |
|
||||||
if (fn == null) { |
|
||||||
delete this._getEvents()[eventName]; |
|
||||||
} else { |
|
||||||
var fns = this._getEvents()[eventName]; |
|
||||||
if (BI._.isArray(fns)) { |
|
||||||
var newFns = []; |
|
||||||
BI._.each(fns, function (ifn) { |
|
||||||
if (ifn != fn) { |
|
||||||
newFns.push(ifn); |
|
||||||
} |
|
||||||
}); |
}); |
||||||
this._getEvents()[eventName] = newFns; |
|
||||||
|
return; |
||||||
} |
} |
||||||
} |
(lis.target ? lis.target : this)[lis.once ? "once" : "on"](lis.eventName, BI._.bind(lis.action, this)); |
||||||
}, |
}); |
||||||
|
delete this.options.listeners; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// 获得一个当前对象的引用
|
||||||
|
_initRef() { |
||||||
|
const o = this.options; |
||||||
|
if (o.__ref) { |
||||||
|
BI.isFunction(o.__ref) ? o.__ref.call(this, this) : o.__ref.current = this; |
||||||
|
} |
||||||
|
if (o.ref) { |
||||||
|
BI.isFunction(o.ref) ? o.ref.call(this, this) : o.ref.current = this; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
/** |
// 释放当前对象
|
||||||
* 清除观察者的所有事件绑定 |
_purgeRef() { |
||||||
*/ |
const o = this.options; |
||||||
purgeListeners: function () { |
if (o.__ref) { |
||||||
/* alex:清空events*/ |
BI.isFunction(o.__ref) ? o.__ref.call(null, null) : o.__ref.current = null; |
||||||
|
o.__ref = null; |
||||||
|
} |
||||||
|
if (o.ref) { |
||||||
|
BI.isFunction(o.ref) ? o.ref.call(null, null) : o.ref.current = null; |
||||||
|
o.ref = null; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
_getEvents() { |
||||||
|
if (!BI._.isObject(this.events)) { |
||||||
this.events = {}; |
this.events = {}; |
||||||
}, |
} |
||||||
|
|
||||||
/** |
return this.events; |
||||||
* 触发绑定过的事件 |
} |
||||||
* |
|
||||||
* @param {String} eventName 要触发的事件的名字 |
/** |
||||||
* @returns {Boolean} 如果事件函数返回false,则返回false并中断其他同名事件的执行,否则执行所有的同名事件并返回true |
* 给观察者绑定一个事件 |
||||||
*/ |
* @param {String} eventName 事件的名字 |
||||||
fireEvent: function () { |
* @param {Function} fn 事件对应的执行函数 |
||||||
var eventName = arguments[0].toLowerCase(); |
*/ |
||||||
var fns = this._getEvents()[eventName]; |
on(eventName, fn) { |
||||||
if (BI.isArray(fns)) { |
eventName = eventName.toLowerCase(); |
||||||
if (BI.isArguments(arguments[1])) { |
let fns = this._getEvents()[eventName]; |
||||||
for (var i = 0; i < fns.length; i++) { |
if (!BI._.isArray(fns)) { |
||||||
if (fns[i].apply(this, arguments[1]) === false) { |
fns = []; |
||||||
return false; |
this._getEvents()[eventName] = fns; |
||||||
} |
} |
||||||
|
fns.push(fn); |
||||||
|
|
||||||
|
return () => this.un(eventName, fn); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 给观察者绑定一个只执行一次的事件 |
||||||
|
* @param {String} eventName 事件的名字 |
||||||
|
* @param {Function} fn 事件对应的执行函数 |
||||||
|
*/ |
||||||
|
once(eventName, fn) { |
||||||
|
const proxy = () => { |
||||||
|
fn.apply(this, arguments); |
||||||
|
this.un(eventName, proxy); |
||||||
|
}; |
||||||
|
this.on(eventName, proxy); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 解除观察者绑定的指定事件 |
||||||
|
* @param {String} eventName 要解除绑定事件的名字 |
||||||
|
* @param {Function} fn 事件对应的执行函数,该参数是可选的,没有该参数时,将解除绑定所有同名字的事件 |
||||||
|
*/ |
||||||
|
un(eventName, fn) { |
||||||
|
eventName = eventName.toLowerCase(); |
||||||
|
|
||||||
|
/* alex:如果fn是null,就是把eventName上面所有方法都un掉*/ |
||||||
|
if (fn === null) { |
||||||
|
delete this._getEvents()[eventName]; |
||||||
|
} else { |
||||||
|
const fns = this._getEvents()[eventName]; |
||||||
|
if (BI._.isArray(fns)) { |
||||||
|
const newFns = []; |
||||||
|
BI._.each(fns, function (ifn) { |
||||||
|
if (ifn !== fn) { |
||||||
|
newFns.push(ifn); |
||||||
} |
} |
||||||
} else { |
}); |
||||||
var args = Array.prototype.slice.call(arguments, 1); |
this._getEvents()[eventName] = newFns; |
||||||
for (var i = 0; i < fns.length; i++) { |
} |
||||||
if (fns[i].apply(this, args) === false) { |
} |
||||||
return false; |
} |
||||||
} |
|
||||||
|
/** |
||||||
|
* 清除观察者的所有事件绑定 |
||||||
|
*/ |
||||||
|
purgeListeners() { |
||||||
|
/* alex:清空events*/ |
||||||
|
this.events = {}; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 触发绑定过的事件 |
||||||
|
* |
||||||
|
* @param {String} eventName 要触发的事件的名字 |
||||||
|
* @returns {Boolean} 如果事件函数返回false,则返回false并中断其他同名事件的执行,否则执行所有的同名事件并返回true |
||||||
|
*/ |
||||||
|
fireEvent() { |
||||||
|
const eventName = arguments[0].toLowerCase(); |
||||||
|
const fns = this._getEvents()[eventName]; |
||||||
|
if (BI.isArray(fns)) { |
||||||
|
if (BI.isArguments(arguments[1])) { |
||||||
|
for (let i = 0; i < fns.length; i++) { |
||||||
|
if (fns[i].apply(this, arguments[1]) === false) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
} |
||||||
|
} else { |
||||||
|
const args = Array.prototype.slice.call(arguments, 1); |
||||||
|
for (let i = 0; i < fns.length; i++) { |
||||||
|
if (fns[i].apply(this, args) === false) { |
||||||
|
return false; |
||||||
} |
} |
||||||
} |
} |
||||||
} |
} |
||||||
return true; |
|
||||||
}, |
|
||||||
|
|
||||||
destroy: function () { |
|
||||||
this.destroyed && this.destroyed(); |
|
||||||
this._purgeRef(); |
|
||||||
this.purgeListeners(); |
|
||||||
} |
} |
||||||
}); |
|
||||||
BI.OB = BI.OB || OB; |
return true; |
||||||
})(); |
} |
||||||
|
|
||||||
|
destroy() { |
||||||
|
this.destroyed && this.destroyed(); |
||||||
|
this._purgeRef(); |
||||||
|
this.purgeListeners(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// BI.OB = BI.OB || OB;
|
||||||
|
|
||||||
|
BI.extend(BI, { OB }); |
||||||
|
Loading…
Reference in new issue