• js 自定义事件观察者模式(发布/订阅)


    /*
     * 示例:
     * Event.create("namespace1").listen('click', function(a){
     *      console.log(a);
     * });
     * Event.create("namespace1").trigger("click", 1);
     */
    window.myEvent = (function() {
       var global = this,
           Event,
           _default = 'default';
    
        Event = function() {
            var _listen,
                _trigger,
                _remove,
                _slice = Array.prototype.slice,
                _shift = Array.prototype.shift,
                _unshift = Array.prototype.unshift,
                namespaceCache = [],
                _create,
                find,
                each = function( ary, fn) {
                    var ret;
                    for(var i = 0, l = ary.length; i < l; i++) {
                        var n = ary[i];
                        ret = fn.call(n, i, n);
                    }
                    return ret;
                };
            // 订阅
            _listen = function(key, fn, cache) {
                if(!cache[key]) {
                    cache[key] = [];
                }
                cache[key].push(fn);
            };
            // 移除订阅
            _remove = function(key, cache, fn) {
                if(cache[key]) {
                    if(fn) {
                        for(var i = cache[key].length; i >=0; i++) {
                            if(cache[key][i] === fn) {
                                cache[key].splice(i, 1);
                            }
                        }
                    }else {
                        cache[key] = [];
                    }
                }
            };
            // 发布
            _trigger = function() {
              var cache = _shift.call(arguments),
                  key = _shift.call(arguments),
                  args = arguments,
                  _self = this,
                  ret,
                  stack = cache[key];
                if(!stack || !stack.length) {
                    return;
                }
                return each(stack, function() {
                   return this.apply(_self, args);
                });
            };
            // 创建命名空间
            _create = function(namespace) {
                var namespace = namespace || _default;
                var cache = {},
                    offlineStack = [],  // 离线事件
                    ret = {
                        listen: function (key, fn, last) {
                            _listen(key, fn, cache);
                            if (offlineStack == null) {
                                return;
                            }
                            if (last === 'last') {
                                offlineStack.length && offlineStack.pop()();
                            } else {
                                each(offlineStack, function () {
                                    this();
                                });
                            }
                            offlineStack = null;
                        },
    
                        one: function (key, fn, last) {
                            _remove(key, cache);
                            this.listen(key, fn, last);
                        },
    
                        remove: function(key, fn, last) {
                            _remove(key, cache, fn);
                        },
    
                        trigger: function() {
                            var fn,
                                args,
                                _self = this;
                            _unshift.call(arguments, cache);
                            args = arguments;
                            fn = function() {
                                return _trigger.apply(_self, args);
                            };
                            if(offlineStack) {
                                return offlineStack.push(fn);
                            }
                            return fn();
                        }
                    };
    
                    return namespace ? (namespaceCache[namespace] ? namespaceCache[namespace] : namespaceCache[namespace] = ret) : ret;
                };
    
            return {
                create: _create,
                one: function(key, fn, last) {
                    var event = this.create();
                    event.one(key, fn, last);
                },
                remove: function(key, fn) {
                    var event = this.create();
                    event.remove(key, fn);
                },
                listen: function(key, fn, last) {
                    var event = this.create();
                    event.listen(key, fn, last);
                },
                trigger: function() {
                    var event = this.create();
                    event.trigger.apply(this, arguments);
                }
            };
        }();
        return Event;
    })();
  • 相关阅读:
    Coding4Fun.Phone.Controls的使用
    发布windows phone应用经历实谈
    我的第一款windows phone软件
    华农js抢课神器
    zookeeper 实战案例分享:cruator客户端编程
    zookeeper学习与实战(二)集群部署
    zookeeper学习与实战(一)环境部署
    Flask框架的学习与实战(三):登陆管理
    Flask框架的学习与实战(二):实战小项目
    Flask框架的学习与实战(一):开发环境搭建
  • 原文地址:https://www.cnblogs.com/tianzhongshan/p/9146134.html
Copyright © 2020-2023  润新知