UNPKG

5.34 kBJavaScriptView Raw
1/**
2 * Module : kero DataTable events
3 * Author : liuyk(liuyk@yonyou.com)
4 * Date : 2016-07-30 14:34:01
5 */
6
7/**
8 * 为DataTable对象添加监听
9 * @memberof DataTable
10 * @param {string|array|object} name 针对不同用法分别对应监听名称、监听名称对应的数组、监听名称及对应的回调组成的对象
11 * @param {function} [callback] 监听对应的回调函数
12 * @param {boolean} [one] 是否只执行一次监听,为true则表示只执行一次回调函数,否则每次触发监听都是执行回调函数
13 * @return {DataTable} 当前的DataTable对象
14 * @example
15 * datatable.on(u.DataTable.ON_ROW_FOCUS, function() {}) // 普通
16 * datatable.on([u.DataTable.ON_INSERT, u.DataTable.ON_DELETE], function() {}) // 数组
17 * datatable.on({u.DataTable.ON_INSERT: function() {}, u.DataTable.ON_DELETE: function() {}}) // map
18 */
19var on = function on(name, _callback, one) {
20 var self = this,
21 origCb = _callback;
22 if (Object.prototype.toString.call(name) == '[object Array]') {
23 // 数组
24 for (var i in name) {
25 this.on(name[i], _callback);
26 }
27 return this;
28 } else if ((typeof name === 'undefined' ? 'undefined' : babelHelpers['typeof'](name)) == 'object') {
29 // map
30 for (var key in name) {
31 this.on(key, name[key]);
32 }
33 return this;
34 }
35 if (one) {
36 _callback = function callback() {
37 self.off(name, _callback);
38 origCb.apply(this, arguments);
39 };
40 }
41 name = name.toLowerCase();
42 this._events || (this._events = {});
43 var events = this._events[name] || (this._events[name] = []);
44 events.push({
45 callback: _callback
46 });
47 return this;
48};
49
50/**
51 * 为DataTable对象取消监听
52 * @memberof DataTable
53 * @param {string|array|object} name 针对不同用法分别对应监听名称、监听名称对应的数组、监听名称及对应的回调组成的对象
54 * @param {function} [callback] 监听对应的回调函数
55 * @return {DataTable} 当前的DataTable对象
56 * @example
57 * datatable.off(u.DataTable.ON_ROW_FOCUS, function() {}) // 普通
58 * datatable.off([u.DataTable.ON_INSERT, u.DataTable.ON_DELETE], function() {}) // 数组
59 * datatable.off({u.DataTable.ON_INSERT: function() {}, u.DataTable.ON_DELETE: function() {}}) // map
60 */
61var off = function off(name, callback) {
62 name = name.toLowerCase();
63 if (!this._events) return this;
64 if (Object.prototype.toString.call(name) == '[object Array]') {
65 // 数组
66 for (var i in name) {
67 this.off(name[i], callback);
68 }
69 return this;
70 } else if ((typeof name === 'undefined' ? 'undefined' : babelHelpers['typeof'](name)) == 'object') {
71 // map
72 for (var key in name) {
73 this.off(key, name[key]);
74 }
75 return this;
76 }
77 var cbs = this._events[name];
78 if (!cbs) return this;
79 if (!callback) {
80 // 解绑所有事件
81 cbs = null;
82 } else {
83 for (var i = cbs.length - 1; i >= 0; i--) {
84 if (cbs[i] == callback) {
85 cbs.splice(i, 1);
86 }
87 }
88 }
89 this._events[name] = cbs;
90 return this;
91};
92
93/**
94 * 为DataTable对象添加只执行一次的监听
95 * @memberof DataTable
96 * @param {string|array|object} name 针对不同用法分别对应监听名称、监听名称对应的数组、监听名称及对应的回调组成的对象
97 * @param {function} [callback] 监听对应的回调函数
98 * @example
99 * datatable.one(u.DataTable.ON_ROW_FOCUS, function() {}) // 普通
100 * datatable.one([u.DataTable.ON_INSERT, u.DataTable.ON_DELETE], function() {}) // 数组
101 * datatable.one({u.DataTable.ON_INSERT: function() {}, u.DataTable.ON_DELETE: function() {}}) // map
102 */
103var one = function one(name, callback) {
104 this.on(name, callback, 1);
105};
106
107/**
108 * 触发DataTable对象绑定的事件监听
109 * @memberof DataTable
110 * @param {string} name 需要触发的事件监听对应的名称
111 * @return {DataTable} 当前的DataTable对象
112 * @example
113 * datatable.trigger('valuechange')
114 */
115var trigger = function trigger(name) {
116 name = name.toLowerCase();
117 if (!this._events || !this._events[name]) return this;
118 var args = Array.prototype.slice.call(arguments, 1);
119 var events = this._events[name];
120 for (var i = 0, count = events.length; i < count; i++) {
121 events[i].callback.apply(this, args);
122 }
123 return this;
124};
125
126// 带返回值的trigger,可以获取回调函数的返回值
127var triggerReturn = function triggerReturn(name) {
128 name = name.toLowerCase();
129 if (!this._events || !this._events[name]) return this;
130 var args = Array.prototype.slice.call(arguments, 1);
131 var events = this._events[name];
132 var flag = true;
133 for (var i = 0, count = events.length; i < count; i++) {
134 flag = flag && events[i].callback.apply(this, args);
135 }
136 return flag;
137};
138
139// 获取监听名称对应的回调函数
140var getEvent = function getEvent(name) {
141 name = name.toLowerCase();
142 this._events || (this._events = {});
143 return this._events[name];
144};
145
146export var eventsFunObj = {
147 on: on,
148 off: off,
149 one: one,
150 trigger: trigger,
151 triggerReturn: triggerReturn,
152 getEvent: getEvent
153};
\No newline at end of file