首页 > 代码库 > JavaScript 自定义事件而不用 MVC 者,都是耍流氓

JavaScript 自定义事件而不用 MVC 者,都是耍流氓

       自定义事件这事儿,得用 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 是不能要的。

JavaScript 自定义事件而不用 MVC 者,都是耍流氓