attachTrigger Class
给对象添加触发器功能,在目标对象上加入触发器功能,目标对象的方法就会具有方法和属性注入功能;所有注入方法使用promiseEvent管理 目前有四种注入方式:
- before,前置注入,在目标方法执行之前执行;
- after,后置执行,在目标方法执行之后执行;
- round,环绕,将目标方法包装,自定义控制;
- error,错误,捕获reject的事件;
src\base\aop.js:352
Constructor
attachTrigger
attachTrigger
(
-
target
-
[mode]
-
[fnInterface]
)
Trigger
Parameters:
name | type | flag | description |
---|---|---|---|
target
| Object | [object] 目标对象 | |
[mode] |
Object | optional | [string] 注入前置和后置所采用的promiseEvent的模式,具体见promsieEvent的add |
[fnInterface] |
Object | optional | ;自定义接口方法;在使用attachTrigger方法后,会在target上附加一些控制方法,为了避免重名和控制对外的方法,使用fnInterface来自定义 |
Returns:
返回附加上了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
扩展对象;(在使用触发器注册后,原始方法不会直接在目标对象下,因此使用obj.test = xx的方式来扩展会替换到所有的注册事件)
Parameters:
name | type | flag | description |
---|---|---|---|
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
)
执行手动触发的Handler
Parameters:
name | type | flag | description |
---|---|---|---|
name
| Object | [string] 手动触发器名称 | |
args
| Object | [array] 执行参数数组 |
Returns:
[object] 执行结果
off
off
(
-
name
-
[trName]
)
chainable
注销注册的后置事件方法
Parameters:
name | type | flag | description |
---|---|---|---|
name
| Object | [string] 目标方法或者属性名称 | |
[trName] |
Object | optional | [string|array] 注册事件方法的名称:
|
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
注销注册的前置事件方法
Parameters:
name | type | flag | description |
---|---|---|---|
name
| Object | [string] 目标方法或者属性名称 | |
[trName] |
Object | optional | [string|array] 注册事件方法的名称:
|
Events
on
注册[后置的]事件方法;注册后置和对象注入
Parameters:
name | type | flag | description |
---|---|---|---|
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
注册前置的事件方法
Parameters:
name | type | flag | description |
---|---|---|---|
name
| Object | [string] 目标方法或者属性名称 | |
trName
| Object | [string] 注册事件方法的名称 | |
fn
| Object | [function] 注册事件方法 | |
[priority] |
Object | optional | [number] 权重设置,同PrmiseEvent |
[mode] |
Object | optional | [string] 加入的事件模式,同PrmiseEvent |
onError
注册错误捕获事件,当执行reject的时候触发
Parameters:
name | type | flag | description |
---|---|---|---|
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
注册手动的触发的Handler
Parameters:
name | type | flag | description |
---|---|---|---|
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
注册环绕触发事件
Parameters:
name | type | flag | description |
---|---|---|---|
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");