给对象添加触发器功能,在目标对象上加入触发器功能,目标对象的方法就会具有方法和属性注入功能;所有注入方法使用promiseEvent管理 目前有四种注入方式:

  1. before,前置注入,在目标方法执行之前执行;
  2. after,后置执行,在目标方法执行之后执行;
  3. round,环绕,将目标方法包装,自定义控制;
  4. error,错误,捕获reject的事件;
Defined in: src\base\aop.js:352
Module: AOP

Constructor

attachTrigger

attachTrigger
(
  • target
  • [mode]
  • [fnInterface]
)
Trigger

Defined in src\base\aop.js:352

Parameters:

nametypeflagdescription
target Object

[object] 目标对象

[mode] Object optional

[string] 注入前置和后置所采用的promiseEvent的模式,具体见promsieEvent的add

[fnInterface] Object optional

;自定义接口方法;在使用attachTrigger方法后,会在target上附加一些控制方法,为了避免重名和控制对外的方法,使用fnInterface来自定义

Returns:

[Trigger]

返回附加上了trigger的对象;

Example:

            var result = [], obj = st.attachTrigger({
                test: function(name) {
                    result.push(name);
                }
            });

            //注册前置
            obj.onBefore("test", "addBefore", function(e, name) {
                result.push('before-' + name)
            })
            //注册后置
            .on("test", "addAfter", function(e, name) {
                result.push('after-' + name)
            });
            //执行test方法
            obj.test('bind');
            //前后置正确触发
            expect(result.join(',')).toBe("before-bind,bind,after-bind");
            var result = [], obj = st.attachTrigger({
                test: {
                    child: function(name) {
                        result.push(name);
                    }
                }
            });
            //注册子对象方法
            obj.onBefore("test.child", "addBefore", function(e, name) {
                result.push('before-' + name)
            }).on("test.child", "addAfter", function(e, name) {
                result.push('after-' + name)
            });
            obj.test.child('bind');
            expect(result.join(',')).toBe("before-bind,bind,after-bind");
            var result = [], obj1 = st.attachTrigger({
                test: function(name) {
                    result.push(name);
                }
            }, {
                //屏蔽trigger的on方法
                on: null,
                //将trigger的onBebefore方法名改成bind
                onBefore: "bind"
            })

            obj1.bind("test", "addBefore", function(e, name) {
                result.push('before-' + name);
            });

            obj1.test('bind');

            expect(obj1.onBefore).toBeUndefined
            expect(obj1.on).toBeUndefined;
            expect(result.join(',')).toBe("before-bind,bind");
            var result = [],obj2 = st.attachTrigger({
                test: function(name) {
                    result.push(name);
                }
            }, "callback");

            obj2.onBefore("test", "addBefore", function(name) {
                result.push('before-' + name);
            }).on("test", "addAfter", function(name) {
                result.push('after-' + name)
            });
            obj2.test('bind');
            expect(result.join(',')).toBe("before-bind,bind,after-bind");
            var result = [],obj = st.attachTrigger({
                test: function(name) {
                    //在原始方法中使用jquery的deferred
                    var e = $.Deferred();
                    setTimeout(function() {
                        result.push(name);
                        e.resolve();
                    }, 100);
                    return e.promise();
                }
            });

            //前置promise
            obj.onBefore('test', 'testBefore', function(e, name) {
                setTimeout(function() {
                    result.push(name + '-before');
                    e.resolve();
                }, 100);
                return e.promise();
            })

            //后置promise
            obj.on('test', 'testAfter', function(e, name) {
                setTimeout(function() {
                    result.push(name + '-after');
                    e.resolve();
                }, 100);
                return e.promise();
            })

            $.when(obj.test('call')).done(function() {
                expect(result.join(',')).toBe('call-before,call,call-after');

            })
            var obj = st.attachTrigger({
                test: function(name) {
                    var e = $.Deferred();
                    setTimeout(function() {
                        e.resolve(name + '-base');
                    }, 100);
                    return e.promise();
                },
                testReturn: function(name) {
                    return name + "-base"
                }
            });

            obj.on('test', 'testAfter', function(e, name) {
                setTimeout(function() {
                    e.resolve(e.result + '-after');
                }, 100);
                return e.promise();
            })

            obj.on('testReturn', 'testAfter', function(e, name) {
                setTimeout(function() {
                    e.resolve(e.result + '-after');
                }, 100);
                return e.promise();
            })

            $.when(obj.test('call')).done(function(data) {
                expect(data).toBe('call-base-after');
                $.when(obj.testReturn('call2')).done(function(data) {
                    expect(data).toBe('call2-base-after');

                });

            });
            var result = [],obj = st.attachTrigger({
                test: 1
            });
            //属性监听只有before,after两种方法注入类型,不支持round环绕模式。
            //before:主要使用在做值变化的控制,比如是否需要更新,或者改变更新的值等等。
            //after:在after则是无法干预值的变化,因此只是做监听使用;

            //回调方法中有三个参数,事件参数e;更新的值value;原来的值oldValue
            obj.onBefore('test', 'testBefore', function(e, value, oldValue) {
                result.push(value + '-before-' + oldValue);
            })

            obj.on('test', 'testAfter', function(e, value, oldValue) {
                result.push(value + '-after-' + oldValue);
            })

            expect(obj.test).toBe(1);

            obj.test = 2;
            //输出前后置监听
            expect(result.join(',')).toBe('2-before-1,2-after-1');
            expect(obj.test).toBe(2);

Methods

extend

extend
(
  • prop
)
chainable

Defined in src\base\aop.js:792

扩展对象;(在使用触发器注册后,原始方法不会直接在目标对象下,因此使用obj.test = xx的方式来扩展会替换到所有的注册事件)

Parameters:

nametypeflagdescription
prop Object

[object] 目标方法或者属性名称

Example:

            var result = [], obj = st.attachTrigger({
                test: function(name) {
                    result.push(name);
                }
            });

            //注册后置testAfter
            obj.on('test', 'testAfter', function(e, name) {
                result.push('after');
            });

            //扩展替换test
            obj.extend({
                test : function(name){
                    result.push(name + ':extend')
                }
            });

            obj.test('test');

            expect(result.join('-')).toBe('test:extend-after');

fireHandler

fireHandler
(
  • name
  • args
)

Defined in src\base\aop.js:677

执行手动触发的Handler

Parameters:

nametypeflagdescription
name Object

[string] 手动触发器名称

args Object

[array] 执行参数数组

Returns:

[object] 执行结果

off

off
(
  • name
  • [trName]
)
chainable

Defined in src\base\aop.js:761

注销注册的后置事件方法

Parameters:

nametypeflagdescription
name Object

[string] 目标方法或者属性名称

[trName] Object optional

[string|array] 注册事件方法的名称:

    1. 空为清除所有
    2. 字符串为单个
    3. 数组为多个

Example:

            var result = [],obj = st.attachTrigger({
                test: function(name) {
                    result.push(name);
                }
            });
            //注册前置testBefore
            obj.onBefore('test', 'testBefore', function(e, name) {
                result.push(name + '-before1');
            })

            //注册前置testBefore2
            obj.onBefore('test', 'testBefore2', function(e, name) {
                result.push(name + '-before2');
            })

            //注销多个前置
            obj.offBefore('test', ['testBefore', 'testBefore2']);

            //注册后置testAfter
            obj.on('test', 'testAfter', function(e, name) {
                result.push(name + '-after');
            })

            //注销单个后置
            obj.off('test', 'testAfter');

            obj.test('call');
            expect(result.join(',')).toBe('call');

offBefore

offBefore
(
  • name
  • [trName]
)
chainable

Defined in src\base\aop.js:777

注销注册的前置事件方法

Parameters:

nametypeflagdescription
name Object

[string] 目标方法或者属性名称

[trName] Object optional

[string|array] 注册事件方法的名称:

    1. 空为清除所有
    2. 字符串为单个
    3. 数组为多个

Events

on

Defined in src\base\aop.js:688

注册[后置的]事件方法;注册后置和对象注入

Parameters:

nametypeflagdescription
name String | Object

目标方法或者属性名称;[object]类型时为对象注入

trName String

注册事件方法的名称|属性名称;对象注入模式下,会自动拼接成trName-[名称|属性名]-[注入方式]

fn Function | Object

注册事件方法;对象注入模式下,[object]类型才会生效

[priority] Object optional

[number] 权重设置,同PrmiseEvent

[mode] Object optional

[string] 加入的事件模式,同PrmiseEvent

Example:

            var result = [], obj = st.attachTrigger({
                test: {
                    child: function(name) {
                        result.push(name);
                    }
                }
            });
            //注册子对象方法
            obj.onBefore("test.child", "addBefore", function(e, name) {
                result.push('before-' + name)
            }).on("test.child", "addAfter", function(e, name) {
                result.push('after-' + name)
            });
            obj.test.child('bind');
            expect(result.join(',')).toBe("before-bind,bind,after-bind");
            var result = [],obj = st.attachTrigger({
                test: function(name) {
                    result.push(name);
                }
            });

            //对象注入
            obj.on({
                //简单的注入后置方法
                test: function(e, name) {
                    result.push('after');
                },
                //注入前置&注入参数设置
                'test before': {
                    //注入方法
                    fn: function(e, name) {
                        result.push('before');
                    },
                    //注入权重
                    priority: 100,
                    //注入模式
                    mode: 'once'
                }
            }, "onObject");

            obj.test('call');
            expect(result.join(',')).toBe('before,call,after');
            var result = [],obj = st.attachTrigger({
                test: 1
            });

            obj.onBefore('test', 'testBefore', function(e, value) {
                result.push(value + '-before');
                //停止方法,阻止赋值行为
                e.stop
            })

            obj.on('test', 'testAfter', function(e, value) {
                result.push(value + '-after');
            })

            obj.test = 2;
            //最终更新失败,输出前置的监听内容
            expect(result.join(',')).toBe('2-before');
            expect(obj.test).toBe(1);

onBefore

Defined in src\base\aop.js:720

注册前置的事件方法

Parameters:

nametypeflagdescription
name Object

[string] 目标方法或者属性名称

trName Object

[string] 注册事件方法的名称

fn Object

[function] 注册事件方法

[priority] Object optional

[number] 权重设置,同PrmiseEvent

[mode] Object optional

[string] 加入的事件模式,同PrmiseEvent

onError

Defined in src\base\aop.js:747

注册错误捕获事件,当执行reject的时候触发

Parameters:

nametypeflagdescription
name Object

[string] 目标方法或者属性名称

trName Object

[string] 注册事件方法的名称

fn Object

[function] 注册事件方法

[mode] Object optional

[string] 加入的事件模式,同PrmiseEvent

Example:

            var testError = st.attachTrigger({
                test: function(name) {
                    var e = $.Deferred();
                    setTimeout(function() {
                        //拒绝契约
                        e.reject('reject');
                    }, 100);
                    return e.promise();
                }
            });
            //注册错误捕获事件
            testError.onError("test", "triggerError", function(err, name) {
                expect(err).toBe('reject');
                expect(name).toBe('call');

            })
            testError.test('call');

onHandler

Defined in src\base\aop.js:661

注册手动的触发的Handler

Parameters:

nametypeflagdescription
name Object

[string] 手动触发器名称

trName Object

[string] 注册事件方法的名称

fn Object

[function] 注册事件方法

[priority] Object optional

[number] 权重设置,同PrmiseEvent

[mode] Object optional

[string] 加入的事件模式,同PrmiseEvent

Example:

            var obj = st.attachTrigger({
                test: function(text) {
                    //手动执行handler
                    return this.fireHandler('handler', [text, "run"]);
                }
            });

            //注册handler1
            obj.onHandler('handler', 'handler1', function(e, text, state) {
                //返回结果
                return text + '-' + state + '-' + 'handler1';
            })

            //注册handler2
            obj.onHandler('handler', 'handler2', function(e, text, state) {
                //接受handler1结果
                return e.result + '-' + 'handler2';
            })

            expect(obj.test('test')).toBe('test-run-handler1-handler2');

onRound

Defined in src\base\aop.js:734

注册环绕触发事件

Parameters:

nametypeflagdescription
name Object

[string] 目标方法或者属性名称

trName Object

[string] 注册事件方法的名称

fn Object

[function] 注册事件方法

Example:

            var result = [],obj3 = st.attachTrigger({
                test: function(name) {
                    result.push(name);
                }
            });

            //注册环绕事件,事件方法参数第一为fn为原方法,后面的为执行参数
            obj3.onRound("test", "roundTest", function(fn, name) {
                result.push('before');
                //执行原有方法
                fn(name);
                result.push('after');
            });

            obj3.test('round');
            expect(result.join(',')).toBe("before,round,after");
Top