以前那篇我写的alloyfinger源码解读那篇帖子,就说过这是一个很好用的手势库,hammer能做的,他都能做到,

而且源码只有350来行代码,很容易看懂。

那么怎么把这么好的库作为omi库的一个插件呢,使dom,用起来更爽,更方便呢?

omi自己有个叫插件体系的功能,主要是赋予dom元素一些能力,并且可以和组件的实例产生关联。

这当然棒极了。那怎么实现的呢?

还是先看个demo,看看用起来爽不,爽的话,再看原理也不迟啊。

        OmiFinger.init();    // 初始化OmiFinger插件

        class App extends Omi.Component {
constructor(data) {
super(data);
} style() {
return `
.touchArea{
background-color: green;
width: 200px;
min-height: 200px;
text-align: center;
color:white;
height:auto;
}
`;
} tap(evt) {
console.log(this.refs.div1);
this.refs.ptext.innerHTML = 'tap';
} longTap(evt) {
console.log(evt);
this.refs.ptext.innerHTML = 'longTap';
} swipe(evt) {
this.refs.ptext.innerHTML = evt.direction;
} render() {
return `
<div>
<div omi-finger class="touchArea" tap="tap" longTap="longTap" swipe="swipe" ref="div1"> <!--在这里写事件名即可-->
Tap or Swipe Me!
<p ref="ptext"></p>
</div>
</div>
`;
} } var app = new App();
Omi.render(app, 'body');

看下结果:

我热,就是这么简单,就把rotate  touchStart  multipointStart  multipointEnd  pinch  swipe  tap  doubleTap  longTap  singleTap  pressMove  touchMove  touchEnd  touchCancel这14个事件都能赋给dom去监听相应的实例函数。

的确很方便,很omi,一个类(哦,不,一个组件(大家都喜欢叫组件,我内心是拒绝的))管理一切啊。

demo的疑问和疑问的说明:

疑问一:

那omi是怎么做到的啊?

答: 其实omi的插件机制代码很少,少的可怜,只是作为Component原型上_execPlugins方法,当然少不了和omi挂钩了,Omi上有个plugins对象属性,里面专门放插件名及插件函数的。

那就一步一步来吧。

demo上的OmiFinger.init();其实就是把初始化了一个插件,放到omi.plugins上去了,仅此而已,没帮我们做别的。来看源码

    Omi.plugins = {};    // omi插件集合

    // 扩展插件的方法(其实是给了plugins这个对象)
Omi.extendPlugin = function(name, handler) {
Omi.plugins[name] = handler;
};

再来看一下OmiFinger.init();方法是不是调用了Omi.extendPlugin方法

var OmiFinger = {};
var noop = function(){ }; var getHandler = function(name, dom, instance) {
var value = dom.getAttribute(name); // 从属性上获取对应的函数名
if (value === null) {
return noop;
}else{
return instance[value].bind(instance); // 从类上找到对应的方法
};
}; OmiFinger.init = function(){
Omi.extendPlugin('omi-finger',function(dom, instance){
if (!instance.alloyFingerInstances) instance.alloyFingerInstances = []; // finger的实例都存到这里面
var len = instance.alloyFingerInstances.length;
var i = 0;
for( ; i<len; i++){
if(instance.alloyFingerInstances[i].dom === dom){ // 如果以前绑定过得, 就先销毁, 然后重新來过
instance.alloyFingerInstances[i].fg.destroy();
instance.alloyFingerInstances.splice(i,1); // 并且剔除
break;
};
};
var alloyFinger = new AlloyFinger(dom,{
touchStart: getHandler('touchStart', dom, instance),
touchMove: getHandler('touchMove', dom, instance),
touchEnd: getHandler('touchEnd', dom, instance),
touchCancel: getHandler('touchCancel', dom, instance),
multipointStart: getHandler('multipointStart', dom, instance),
multipointEnd: getHandler('multipointEnd', dom, instance),
tap: getHandler('tap', dom, instance),
doubleTap: getHandler('doubleTap', dom, instance),
longTap: getHandler('longTap', dom, instance),
singleTap: getHandler('singleTap', dom, instance),
rotate: getHandler('rotate', dom, instance),
pinch: getHandler('pinch', dom, instance),
pressMove: getHandler('pressMove', dom, instance),
swipe: getHandler('swipe', dom, instance)
});
instance.alloyFingerInstances.push({fg:alloyFinger,dom:dom});
});
} OmiFinger.destroy = function(){
delete Omi.plugins['omi-finger'];
}; window.OmiFinger = OmiFinger;

这里我把代码都贴出来,因为比较简单。

Omi.plugins有了对象插件名和函数,那是怎么循环遍历的呢?

其实就在Component类的_render方法最后面,遍历的,也就是当html插入到指定容器后,再调用的。

那是怎么调用的呢?

    // 插件机制
_execPlugins(){
Object.keys(Omi.plugins).forEach(item => { // 遍历omi的插件
let nodes = Omi.$$('*['+item+']',this.node); // 具有插件名属性的dom
nodes.forEach(node => {
if(node.hasAttribute(this._omi_scoped_attr) ) { // 节点是否含有_omi_scoped_id属性
Omi.plugins[item](node, this); // 调用插件init方法中第二个函数
};
});
if(this.node.hasAttribute(item)) { // 看一下根节点是否含有插件名属性,有的话也执行
Omi.plugins[item](this.node, this);
};
});
}

可以看到,会传2个参数,一个dom,一个实例.正是验证了官网的这句话。 Omi插件体系可以赋予dom元素一些能力,并且可以和组件的实例产生关联。

至此就这么说完了。

ps:

当然还有transform.js, touch.js也可以让dom玩的飞起,后续再写帖子吧。

Omi框架学习之旅 - 插件机制之omi-finger 及原理说明的更多相关文章

  1. Omi框架学习之旅 - 插件机制之omi-touch 及原理说明

    这个插件也能做好多好多的事,比如上拉下拉加载数据,轮播,等一切和运动有关的特效. 具体看我的allowTouch这篇博客,掌握了其用法,在来看它是怎么和omi结合的.就会很简单. 当然使用起来也比较方 ...

  2. Omi框架学习之旅 - 插件机制之omi-router及原理说明

    先来看看官网的介绍吧:https://github.com/AlloyTeam/omi/tree/master/plugins/omi-router 其实我推荐直接看官网的介绍.我所写的,主要给个人做 ...

  3. Omi框架学习之旅 - 插件机制之omi-transform及原理说明

    给omi-transform插件做个笔记,使用起来也很爽. transform.js这个库,一直想写一篇帖子的,可是,数学不好,三维矩阵和二位矩阵理解的不好,所以迟迟没写了, 这也是一个神库,反正我很 ...

  4. Omi框架学习之旅 - 之开篇扯蛋

    说实话, 我也不知道Omi是干啥的, 只因此框架是alloyTeam出的, dntzhang写的, 也有其他腾讯大神参与了, 还有一些其他贡献者, 以上我也不太清楚, 当我胡说八嘎. 因其写法有人说好 ...

  5. Omi框架学习之旅 - Hello World 及原理说明

    学什么东西都从hello world开始, 我也不知道为啥. 恩,先上demo代码, 然后提出问题, 之后解答问题, 最后源码说明. hello world - demo: class Hello e ...

  6. Omi框架学习之旅 - 获取DOM节点 及原理说明

    虽然绝大部分情况下,开发者不需要去查找获取DOM,但是还是有需要获取DOM的场景,所以Omi提供了方便获取DOM节点的方式. 这是官网的话,但是我一直都需要获取dom,对dom操作,所以omi提供的获 ...

  7. Omi框架学习之旅 - 生命周期 及原理说明

    生命周期 name avatars company constructor 构造函数 new的时候 install 初始化安装,这可以拿到用户传进的data进行处理 实例化 installed 安装完 ...

  8. Omi框架学习之旅 - 通过omi-id来实现组件通讯 及原理说明

    这个demo是通过omi-id来获取子类的实例,然后更改data属性,之后updata一下就好了. 老规矩:先上demo代码, 然后提出问题, 之后解答问题, 最后源码说明. class Hello ...

  9. Omi框架学习之旅 - 通过对象实例来实现组件通讯 及原理说明

    组件通讯不是讲完了吗(上帝模式还没讲哈),怎么又多了种方式啊. 你484傻,多一种选择不好吗? 其实这个不属于组件通讯啦,只是当父组件实例安装和渲染完毕后,可以执行installed这个方法(默认是空 ...

随机推荐

  1. HDU6191(01字典树启发式合并)

    Query on A Tree Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Othe ...

  2. yum 安装 php5.6.36

    PHP安装测试可以 rpm -Uvh http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/i386/epel-release-6-8.noarch.rpm; rp ...

  3. CSS图片两端对齐,自适应列表布局末行对齐修复实例页面

    写在前面 前端开发,图片两端对齐,是十分常见的,也是十分痛苦的,我试过好多方法,通过整理,认为下面还是比较靠谱的,在实践中大家可以试试,欢迎一起学习,一起进步 HTML代码 HTML代码非常简单,用的 ...

  4. 【读书笔记】iOS-访问网络

    iOS平台是按照一直有网络连接的思路来设计的,开发者利用这一特点创造了很多优秀的第三方应用.大多数的iOS应用都需要联网,甚至有些应用严重依赖网络,没有网络就无法正常工作. "在访问网络失败 ...

  5. 【BI学习笔记】在Linux上安装Wyn Enterprise商业智能报表服务器

    在百度文库上找来的,放到这里,避免以后丢了. 葡萄城出品的Wyn Enterprise商业智能软件的设计器和查看视图是通过浏览器使用的,不需要安装专门的程序.Wyn Enterprise的服务器端可以 ...

  6. CloudSim——云计算仿真软件概述

    CloudSim是由澳大利亚墨尔本大学的网格实验室和Gridbus项目宣布推出的云计算仿真软件. CloudSim是做什么的呢?可以简单理解为一个帮助研究.开发.测试的工具,如虚拟机资源分配算法.节能 ...

  7. android一个倾斜的TextView,适用于标签效果

    描述: android一个倾斜的TextView,适用于标签效果 应用截图: 使用说明: <com.haozhang.lib.SlantedTextView android:layout_wid ...

  8. mybatis学习系列一

    1引入dtd约束(6) Mybatis git地址:https://github.com/mybatis/mybatis-3/wiki/Maven 指导手册:http://www.mybatis.or ...

  9. python2 与 python3 如何实现共存

    1.现在我本机系统已内置python2.6 2.下载进行源码安装 复制链接下载到 /root/mypackage,解压 接着 mkdir /usr/local/python3 然后在解压后的文件夹内执 ...

  10. [20170628]11g修改用户名.txt

    [20170628]11g修改用户名.txt --//昨天看了链接,提到修改用户名:http://www.oratea.com/2017/06/26/oracle-11g%e4%bf%ae%e6%94 ...