写angularJS源码阅读系列的时候,写的太垃圾了。一个月后看,真心不忍直视,以后有机会的话得重写。这次写avalonJS,希望能在代码架构层面多些一点,少上源码、多写思路。

avalon暴露句柄方式

(function(DOC){
...
avalon=...//没有var
...
})(document) 具体暴露句柄方式的讲解,在这里。 avalon Dom遍历 源码的末尾执行了这么avalon.ready(function(){...})一个函数,而这个函数的末尾为avalon.scan(DOC.body)于是乎,avalon开始了读body旅程。
在这旅程中,有scanNodes、scanTag、scanAttr、scanText、scanExpr、scanTemplate需要来回流转运用。在讲解读取dom之前,我们先了解下dom的组成,节点类型(document.nodeType): 节点类型(nodeType) 元素类型
1 元素element
2 属性attr
3 文本text
8 注释comments
9 文档document 我们可以通过节点类型和具体的元素标签来判定将要解析的和不会去解析的。
scanNodes 我们先看scanNodes(parentElement,vmodels)函数,他的作用是通过parentElement.firstChild``child.nextSibling遍历当前dom下的子节点,并且通过节点类型的判定,各自调用scanTag(nodeType==1)和scanText(NodeType==8 && 存在{{...}})函数。
scanTag scanTag(elem, vmodels, node),这个函数蛮有意思的,第三个参数node是作者不想进行var声明,直接写在参数里的。这个函数的作用是判定avalon执行作用域的,作用域有三类:ms-skip ms-import和 ms-controller(有优先顺序),ms-important不包含父VM,ms-controller相反会有继承效果。
当然,这时候游览器还没有执行用户自定义的avalon.defined,所以不会调用scanAttr继续旅行的。
scanText scanText(textNode, text, vmodels),顾名思义,会具体解析解析...{{...}}...的值。这样的话,就会涉及avalon filter的解析,具体解析方法放在scanExpr里面,scanText主要替换...{{...}}...为解析后的数据,并且如果有用了filter的话,会调用executeBindings进行相应的处理。
该函数会产生一个记录scanText解析结果的object。数据结构为: {
type: "text",//类型
node: node,//替换后的element
nodeType: 3,//节点类型
value: token.value,
filters: token.filters
//token 为scanExpr的返回值
} scanExpr scanExpr(str),这个函数只要知道返回的结果格式就好。
scanAttr scanAttr(elem, vmodels)这个函数super重要的,他会针对avalon封装的事件和ms-if repeat widget等做相应的处理。会在下一章连同executeBindings一块讲解。
scanTemplate scanTemplate属于模板加载,以后可能会在这里补上或者新开一篇文章单独讲解它。
小记 如果有遍历dom需求的话,上面代码可经过去除依赖处理后摘出来。基本流程:从头到脚的开始遍历,根据存放在dom attribute的值来判定业务需求和vm作用域,ms-duplex属性和{{}}做占位符,等待渲染和占位符替换。VMODELS object则存放着要渲染进页面的数据。

http://my.oschina.net/myprogworld/blog/228949

avalonJS-源码阅读(一)的更多相关文章

  1. avalon源码阅读(1)

    来源 写angularJS源码阅读系列的时候,写的太垃圾了. 一个月后看,真心不忍直视,以后有机会的话得重写. 这次写avalonJS,希望能在代码架构层面多些一点,少上源码.多写思路. avalon ...

  2. 【原】FMDB源码阅读(三)

    [原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...

  3. 【原】FMDB源码阅读(二)

    [原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...

  4. 【原】FMDB源码阅读(一)

    [原]FMDB源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 说实话,之前的SDWebImage和AFNetworking这两个组件我还是使用过的,但是对于 ...

  5. 【原】AFNetworking源码阅读(六)

    [原]AFNetworking源码阅读(六) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这一篇的想讲的,一个就是分析一下AFSecurityPolicy文件,看看AF ...

  6. 【原】AFNetworking源码阅读(五)

    [原]AFNetworking源码阅读(五) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇中提及到了Multipart Request的构建方法- [AFHTTP ...

  7. 【原】AFNetworking源码阅读(四)

    [原]AFNetworking源码阅读(四) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇还遗留了很多问题,包括AFURLSessionManagerTaskDe ...

  8. 【原】AFNetworking源码阅读(三)

    [原]AFNetworking源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇的话,主要是讲了如何通过构建一个request来生成一个data tas ...

  9. 【原】AFNetworking源码阅读(二)

    [原]AFNetworking源码阅读(二) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇中我们在iOS Example代码中提到了AFHTTPSessionMa ...

  10. 【原】AFNetworking源码阅读(一)

    [原]AFNetworking源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 AFNetworking版本:3.0.4 由于我平常并没有经常使用AFNetw ...

随机推荐

  1. Distinct Substrings SPOJ - DISUBSTR(后缀数组水题)

    求不重复的子串个数 用所有的减去height就好了 推出来的... #include <iostream> #include <cstdio> #include <sst ...

  2. 布隆过滤器 Bloom Filter

    使用普通集合来判断一个元素是否已存在于集合中,需要占用比较大的空间.而使用Bloom Filter 可有效节省空间. Bloom Filter 以较少的内存占用及较小的误判率达到判断元素是否存已经加入 ...

  3. Chapter 6(树)

    1.树的储存方式 //****************双亲表示法************************ #define Max_TREE_SIZE 100 typedef int TElem ...

  4. 阿里云上部署了zabbix,突然无法收到报警邮件的解决办法

    在阿里云上部署了zabbix,一直能正常接收到zbx发来的报警邮件(报警邮箱是163的),不知是什么原因,突然无法接收到报警邮件了. 但在服务器上手动执行echo "hello"| ...

  5. R语言:R2OpenBUGS

    R语言:R2OpenBUGS 用这个包调用BUGS model,分别用表格和图形概述inference和convergence,保存估计的结果 as.bugs.array 转换成bugs object ...

  6. python的map函数的使用方法详解以及使用案例(处理每个元素的自增、自减、平方等)

    1.用我们之前学过的求一下平方(只有一个列表) #求平方 num=[1,5,6,2,7,8] a=[] for n in num: a.append(n**2) print (a) C:\python ...

  7. 疯狂Android讲义

    1 Android应用和开发环境2 Android应用的界面编程3 Android的事件处理4 Activity Fragment5 Intent IntentFilter6 Android应用的资源 ...

  8. Java基础-字符串连接运算符String link operator

    Java基础-字符串连接运算符String link operator 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 字符串链接运算符是通过“+”进行拼接的. 一.使用“+”进行字 ...

  9. 《剑指offer》面试题45 圆圈中最后剩下的数字(Java版本)

    引言 这道题网上的讲解都是直接抄书,没意思,所以想自己写一写,补充一下,便于自己理解.另外,大家都忽略了经典解法,虽然这种解法效率不及第二种,但是我觉得在项目当中阅读性其实很重要,牺牲一点点效率保证代 ...

  10. Kafka 0.8 Producer处理逻辑

    Kafka Producer产生数据发送给Kafka Server,具体的分发逻辑及负载均衡逻辑,全部由producer维护. 1.Kafka Producer默认调用逻辑 1.1 默认Partiti ...