UNPKG

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