avalonJS-源码阅读(一)
写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-源码阅读(一)的更多相关文章
- avalon源码阅读(1)
来源 写angularJS源码阅读系列的时候,写的太垃圾了. 一个月后看,真心不忍直视,以后有机会的话得重写. 这次写avalonJS,希望能在代码架构层面多些一点,少上源码.多写思路. avalon ...
- 【原】FMDB源码阅读(三)
[原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...
- 【原】FMDB源码阅读(二)
[原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...
- 【原】FMDB源码阅读(一)
[原]FMDB源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 说实话,之前的SDWebImage和AFNetworking这两个组件我还是使用过的,但是对于 ...
- 【原】AFNetworking源码阅读(六)
[原]AFNetworking源码阅读(六) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这一篇的想讲的,一个就是分析一下AFSecurityPolicy文件,看看AF ...
- 【原】AFNetworking源码阅读(五)
[原]AFNetworking源码阅读(五) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇中提及到了Multipart Request的构建方法- [AFHTTP ...
- 【原】AFNetworking源码阅读(四)
[原]AFNetworking源码阅读(四) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇还遗留了很多问题,包括AFURLSessionManagerTaskDe ...
- 【原】AFNetworking源码阅读(三)
[原]AFNetworking源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇的话,主要是讲了如何通过构建一个request来生成一个data tas ...
- 【原】AFNetworking源码阅读(二)
[原]AFNetworking源码阅读(二) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇中我们在iOS Example代码中提到了AFHTTPSessionMa ...
- 【原】AFNetworking源码阅读(一)
[原]AFNetworking源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 AFNetworking版本:3.0.4 由于我平常并没有经常使用AFNetw ...
随机推荐
- 【spring学习笔记二】Bean
### bean的三种实例化方式: 1.构造 2.静态工厂 3.实例工厂 其中,工厂就是工厂的概念,工厂函数factor-method会返回她生产出来的产品类. 而构造初始化也可以选择初始化方式和销毁 ...
- 【Cf #502 H】The Films(莫队)
题面的简述:总共有$m$种书,书架上共有$n$本书,给出$n$本书的种类,并有$Q$个询问,每次询问给出$l, r, k$.每次询问时都会先出现$k * m$本书,每种书各$k$本,然后再加入书架上的 ...
- 【bzoj3598】 Scoi2014—方伯伯的商场之旅
http://www.lydsy.com/JudgeOnline/problem.php?id=3598 (题目链接) 题意 Solution 原来这就是极水的数位dp,呵呵= =,感觉白学了.htt ...
- 【hdu3555】 Bomb
http://acm.hdu.edu.cn/showproblem.php?pid=3555 (题目链接) 题意 求区间${[1,n]}$含有49的数的个数. Solution 数位dp,先求出不含4 ...
- BZOJ 4802 欧拉函数
4802: 欧拉函数 Description 已知N,求phi(N) Input 正整数N.N<=10^18 Output 输出phi(N) Sample Input 8 Sample Outp ...
- 一个最简单的使用Entity Framework 查询SQL 数据库的例子
1.ADO.NET 3.5 Entity Framework是随着.net framework 3.5一起发布的,确认开发环境版本是大于等于3.5版本 2.确认已经安装了ADO.NET 3.5 Ent ...
- linux命令总结sed命令详解
Sed 简介 sed 是一种新型的,非交互式的编辑器.它能执行与编辑器 vi 和 ex 相同的编辑任务.sed 编辑器没有提供交互式使用方式,使用者只能在命令行输入编辑命令.指定文件名,然后在屏幕上查 ...
- JSP中九大内置对象+request对象的属性介绍和如何应用
JSP的九大内置对象requestresponseApplicationconfigoutpagepageContextsessionException默认没有,需要进行在Page指令下进行isErr ...
- spark-shell启动spark报错
前言 离线安装好CDH.Coudera Manager之后,通过Coudera Manager安装所有自带的应用,包括hdfs.hive.yarn.spark.hbase等应用,过程很是波折,此处就不 ...
- jQuery 动态标签生成插件
前言: 最近对js的插件封装特别感兴趣,无耐就目前的技术想做到js的完全封装,还是有一定困难,就基于jQuery封装了一个小的插件,而且是基于对象级开发的,不是添加全局方法.高深的语法几乎没有,就有一 ...