版权声明:可以转载,但请先关注我公众号——光宇广贞 https://blog.csdn.net/hikaliv/article/details/41444067
自定义事件这事儿,得用 MVC。
宝宝和我说,凡是写事件不用 MVC 者,都是耍流氓。我对此深以为然。
其实宝宝只说过后半句。
事件这玩意儿,从实现上来说,需要实现委托注册管理和事件触发回调这两块;从定义上来说,需要由事件服务定义委托管理和事件触发,由事件监听者定义委托注册和事件回调;从角色划分来说,需要分为服务者、触发者、监听者。这套排列组合,你已经乱了是吧。所以说,事件长得是这德性的:
// 服务者
public delegate void EventHandler(object sender, EventArgs e);
public event EventHandler SomeEventHandler;
protected virtual void OnSomeEvent(EventArgs e) {
if(SomeEventHandler) {
SomeEventHandler(this, e);
}
}
// 触发者
OnSomeEvent(EventArgs.Instance);
// 监听者
SomeEventHandler += (s, e) => {};
好,这就是定义式,交给 C# 来下定义。话说,这个 EventArgs 类用得很传神啊,省得变长参了~用这么重的语言下的定义反而是最简洁的。
所以宝宝说得对,就得用 MVC。
因此,先定义事件服务,才是根本:
app.service('Events', function () {
var eventlist = {};
this.on = function (event, callback) {
if (!eventlist[event]) {
eventlist[event] = [];
}
eventlist[event].push(callback);
return this;
};
this.un = function (event) {
for (var i = 0, l = eventlist[event].length; i < l; i++) {
eventlist[event][i] = null;
}
delete eventlist[event];
return this;
};
this.trigger = function (event) {
if (eventlist[event]) {
var args = Array.prototype.slice.call(arguments).slice(1);
for (var i = 0, l = eventlist[event].length; i < l; i++) {
eventlist[event][i].apply(null, args);
}
}
return this;
};
})
委托管理完了,完成事件触发:
Events.trigger('Event1', 'Para1', 'Para2').trigger('Event2', 'Para1');
然后就是委托注册和事件回调:
Events.on('Event1', function (e, f) {
// 操作 e f
}).on('Event2', function (e) {
// 操作 e
});
这就写完了。没法儿再简洁了。
---------------------------------------
紫鹃依旧香甜。
港版 iphone6 下个月就差不多了。
6P 的问题太多了,连自己的系统应用都坑。如果这款产品没有后续的话……总归,6P 是不能要的。