上篇介绍了PromiseEvent,本篇介绍Trigger - 基于Promise的aop的体现;(感觉自己的对这些命名一直都很挫,也懒得想了,所以就凑合的用)

Trigger

在目标对象上加入触发器功能,目标对象的方法就会具有方法注入功能,注入的方式有before(前置执行),after(后置执行)和round(环绕),另外还有一个exception模式,因为异常处理的模块还没完成,暂时先空缺。

接口方法

    st.attachTrigger(target, mode, fnInterface);

    //后置注入方法
target.on(name, trName, fn, priority, eventMode)
//前置置注入方法
target.onBefore(name, trName, fn, priority, eventMode)
//方法环绕
target.onRound(name, trName, fn)
//删除注入方法
target.off(name, trName)
//删除前置注入方法
target.offBefore(name, trName)
//替换目标对象的原始方法
target.extend(prop)

参数讲解

target : 目标对象;

mode:回调模式,同promisEvent的mode设置

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

使用了attachTrigger后,会在target上附加上注入控制的方法,on,onBefore等

name :需要注入的target的方法名

trName : 加入触发回调名称

fn:注入方法,方法参数同PrmiseEvent的回调参数

priority :权重设置,同PrmiseEvent ;

eventMode :加入的事件模式,同PrmiseEvent

需要注意的是on和onBefore注入的方法接口是fn(e,arg,...)

e同PromiseEvent参数设置,唯一不同的是有两个新加入的控制:

e.preventDefault 阻止默认的方法,即target的原始方法; 但不会影响回调事件的

e.stop() 停止方法执行,无论是原始方法还是回调;

而onRound的是fn(originalFn,arg,..),环绕和前后置不冲突

originalFn : 需要环绕的方法;

使用样例

前后置

    var result = [];
var obj = {
test: function(name) {
result.push(name);
}
}; //加入触发器
st.attachTrigger(obj); //加入前置方法
obj.onBefore("test", "addBefore", function(d, name) {
result.push('before-' + name)
}); //加入后置方法
obj.on("test", "addAfter", function(d, name) {
result.push('after-' + name)
}); //执行,结果"before-bind,bind,after-bind"
obj.test('bind');

自定义接口iFace

 var obj1 = st.attachTrigger({
test: function(name) {
result.push(name);
}
}, {
//屏蔽后置方法on
on: null,
//将前置方法onBefore设置为bind
onBefore: "bind"
}) obj1.bind("test", "addBefore", function(d, name) {
result.push('before-' + name);
});

方法环绕

  var obj3 = st.attachTrigger({
test: function(name) {
result.push(name);
}
}); 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");

promise控制

在前置和后置中都是通过promiseEvent的事件参数做promise控制,但在原始方法中,为了避免干预原始方法带来的混乱,则没有加入事件参数,而是通过使用JQuery的deffered来做控制

var obj = st.attachTrigger({
test: function(name) {
//原始方法中使用jquery的deferred
var d = $.Deferred();
setTimeout(function() {
result.push(name);
d.resolve();
}, 100);
return d.promise();
}
}); obj.onBefore('test', 'testBefore', function(d, name) {
setTimeout(function() {
result.push(name + '-before');
d.resolve();
}, 100);
return d.promise();
}) obj.on('test', 'testAfter', function(d, name) {
setTimeout(function() {
result.push(name + '-after');
d.resolve();
}, 100);
return d.promise();
}) $.when(obj.test('call')).done(function() {
expect(result.join(',')).toBe('call-before,call,call-after');
})

结果传递

var obj = st.attachTrigger({
//promise参数传递
test: function(name) {
var d = $.Deferred();
setTimeout(function() {
d.resolve(name + '-base');
}, 100);
return d.promise();
},
//return 结果传递
testReturn: function(name) {
return name + "-base"
}
}); obj.on('test', 'testAfter', function(d, name) {
setTimeout(function() {
d.resolve(d.result + '-after');
}, 100);
return d.promise();
}) obj.on('testReturn', 'testAfter', function(d, name) {
setTimeout(function() {
d.resolve(d.result + '-after');
}, 100);
return d.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');
});

stop控制

var obj = st.attachTrigger({
test: function(name) {
result.push(name);
}
}); obj.onBefore('test', 'testBefore', function(d, name) {
//停止后续的执行
d.stop();
result.push(name + '-before1');
}) obj.onBefore('test', 'testAfter', function(d, name) {
result.push(name + '-before2');
}) obj.on('test', 'testBefore2', function(d, name) {
result.push(name + '-after');
}) obj.test('call');
expect(result.join(',')).toBe('call-before1');

stopPropagation和preventDefault控制

var obj = st.attachTrigger({
test: function(name) {
result.push(name);
}
}); obj.onBefore('test', 'testBefore', function(d, name) {
result.push(name + '-before1');
//stopPropagation阻止before的回调,preventDefault阻止默认方法
d.stopPropagation().preventDefault();
}) obj.onBefore('test', 'testAfter', function(d, name) {
result.push(name + '-before2');
}) obj.on('test', 'testBefore2', function(d, name) {
result.push(name + '-after');
}) obj.test('call');
//最终输出第一个before回调和后置回调
expect(result.join(',')).toBe('call-before1,call-after');

更多的例子请参考smartjs上的测试用例

smartJS 0.1 API 讲解 - Trigger的更多相关文章

  1. smartJS 0.1 API 讲解 - FlowController

    本篇介绍0.1版中最后一个特性,FlowController:同时也对第一版总结一下,因为近两年全部都是在搞前端,都是做一些js框架类的东西,也做了不少有意思的功能,做smartjs对我来说一个是对自 ...

  2. smartJS 0.1 API 讲解 - PromiseEvent

    上篇简单的介绍smartjs了一些通用方法的api.这篇介绍基础的PromiseEvent(这个名字一直没想好,以前准备用callbacks的,但避免与jquery混淆,st的命名空间可以直接挂到$上 ...

  3. smartjs 0.2 OOP讲解 - Klass 类继承

    SmartJS2.0加入OOP的功能.OOP包括klass与factory两个对象. Klass 类继承 与其他的类继承相比,smartjs使用了执行指针的概念(后面例子中会介绍),另外提供base基 ...

  4. smartjs 0.2 OOP讲解 - factory

    本篇介绍OOP的第二个对象factory.在以往项目中其实真正使用klass的地方相当少,而factory则是十分常见的. 在smartjs中的factory并不是指的是工厂模式.在factory要求 ...

  5. smartjs 0.2发布 - 新增oop模块&AOP增强

    SmartJS2.0发布,更新内容如下: 新增oop(klass,factory)模块: promiseEvent加入非阻塞模式noBlock: trigger加入属性监听; smartjs主模块优化 ...

  6. 【jquery】 API讲解 内部培训资料

    资料在百度云盘 一.jquery  API讲解 1.jquery  api如何使用 jquery  api http://www.hemin.cn/jq/ 2.常用api讲解 选择器: 通过$()获取 ...

  7. AFNetworking 2.0 新特性讲解之AFHTTPSessionManager

    AFNetworking 2.0 新特性讲解之AFHTTPSessionManager (2014-02-17 11:56:24) 转载▼     AFNetworking 2.0 相比1.0 API ...

  8. Spark 下操作 HBase(1.0.0 新 API)

    hbase1.0.0版本提供了一些让人激动的功能,并且,在不牺牲稳定性的前提下,引入了新的API.虽然 1.0.0 兼容旧版本的 API,不过还是应该尽早地来熟悉下新版API.并且了解下如何与当下正红 ...

  9. ASP.NET CORE 1.0 MVC API 文档用 SWASHBUCKLE SWAGGER实现

    from:https://damienbod.com/2015/12/13/asp-net-5-mvc-6-api-documentation-using-swagger/ 代码生成工具: https ...

随机推荐

  1. jquery操作select2控件

    (一)select2常用的操作:添加.移除.获取选中的value()与text() (1)移除事件:$("#select_id").unbind("change" ...

  2. 赵雅智_service生命周期

    Android中的服务和windows中的服务是类似的东西,服务一般没实用户操作界面.它执行于系统中不easy被用户发觉,能够使用它开发如监控之类的程序. 服务的开发步骤 第一步:继承Service类 ...

  3. 算法笔记_161:算法提高 十进制数转八进制数(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 编写函数,其功能为把一个十进制数转换为其对应的八进制数.程序读入一个十进制数,调用该函数实现数制转换后,输出对应的八进制数. 样例输入 9274 样 ...

  4. C#开发Unity游戏教程循环遍历做出推断及Unity游戏演示样例

    C#开发Unity游戏教程循环遍历做出推断及Unity游戏演示样例 Unity中循环遍历每一个数据,并做出推断 非常多时候.游戏在玩家做出推断以后.游戏程序会遍历玩家身上大量的所需数据,然后做出推断. ...

  5. macOS中安装docker

    如官方文档中所说: 1.点击进入boot2docker/osx-installer release页面. 2.在下载页面中点击 Boot2Docker-x.x.x.pkg 来下载 Boot2Docke ...

  6. DDL语句--改动表

    改动表是指改动数据库中已经存在的表的定义.改动表比又一次定义表简单.不须要又一次载入数据.也不会影响正在进行的服务. MySQL中通过ALTER TABLE语句来改动表.改动表包含改动表名.改动字段数 ...

  7. js对数组按顺序排序

    console.log("------默认排序(ASCII字符排序)------"); ,,,,]; arr.sort(); //ASCII字符代码从小到大排序 console.l ...

  8. java基础讲解08-----类和对象

    1.什么是面向对象? 面向对象设计的实质 就是对现实世界的对象进行建模操作. 现实的生活中,随处可见的一种事物就是对象,对象是事物存在的实体,通常我们将会对对象划分为两个部分,静态部分和动态部分.比如 ...

  9. 【LeetCode-面试算法经典-Java实现】【101-Symmetric Tree(对称树)】

    [101-Symmetric Tree(对称树)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a binary tree, check whether ...

  10. WCF问题集锦:未依照DataMember定义的名称序列化对象

    今遇到WCF序列化BUG,代码例如以下: /// <summary> /// 包括数据的返回对象 /// </summary> /// <typeparam name=& ...