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 | */
|
20 | const 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 | */
|
62 | const 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 | */
|
105 | const 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 | */
|
117 | const 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,可以获取回调函数的返回值
|
129 | const 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 | // 获取监听名称对应的回调函数
|
142 | const getEvent = function(name) {
|
143 | name = name.toLowerCase()
|
144 | this._events || (this._events = {})
|
145 | return this._events[name]
|
146 | }
|
147 |
|
148 | export const eventsFunObj = {
|
149 | on: on,
|
150 | off: off,
|
151 | one: one,
|
152 | trigger: trigger,
|
153 | triggerReturn: triggerReturn,
|
154 | getEvent: getEvent
|
155 | }
|