来源

写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) 元素类型

元素element
属性attr
文本text

注释comments
文档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的值   来判定业务需求和  v  m作用域,

ms-duplex属性和  {{}}  做占位符,等待渲染和占位符替换。

VMODELS object则存  放着要  渲染进页面的数据。

avalon源码阅读(1)的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. 03_Spark集群部署

    [安装前的环境准备] Hadoop:2.6.1Java:jdk-1.7.0Spark: spark-1.6.0-bin-hadoop2.6.tgzScala: scala-2.11.4.tgz虚拟机: ...

  2. 【Python】【元编程】【一】动态属性和特性

    #19.1 使用动态属性转换数据"""#栗子19-2 osconfeed.py:下载 osconfeed.jsonfrom urllib.request import u ...

  3. 通过设置代理,解决服务器禁止抓取,报“java.io.IOException: Server returned HTTP response code: 403 for URL”错误的方法

    java.io.IOException: Server returned HTTP response code: 403 for URL: http:// 这个是什么异常呢? 当你使用java程序检索 ...

  4. MarkChanges: Jmeter

    1. 20180627 调整启动的内存set HEAP=-Xms1024m -Xmx1024m2. 20180627 调整输出格式为xml #jmeter.save.saveservice.outpu ...

  5. 解决在nginx+php环境下$_SERVER['PHP_SELF']获取不到值的问题

    Tp3.2. __APP__获取值不正确.$_SERVER['PHP_SELF']为空导致. 原来是php.ini的问题. sudo vim /usr/local/php/etc/php.ini 重启 ...

  6. MongoDB(课时21 索引)

    3.5 索引(重点) 任何数据库中,索引都是一种提升数据库检索性能的手段,这一点在MongoDB数据库中同样是存在的,MongoDB数据库里面存在两种索引创建:一是自动创建,另外是手工创建. 范例:重 ...

  7. 【Robot Framework 项目实战 01】使用 RequestsLibrary 进行接口测试

    写在前面 本文我们一起来学习如何使用Robot Framework 的RequestsLibrary库,涉及POST.GET接口测试,RF用例分层封装设计等内容. 接口 接口测试是我们最常见的测试类型 ...

  8. External RNA Controls Consortium (ERCC)

    ERCC是啥? 外部RNA控制联盟,就是一套RNA-seq,基因表达检测过程中的控制系统,使得结果具有可重复性. RNA Spike-in Controls for Gene Expression W ...

  9. Confluence 6 从 Crowd 或 JIRA 应用中切换回使用内部用户管理

    如果你的 Confluence 站点当前使用的是 Crowd 或者 Jira 应用程序管理你的用的话,你可以按照下面的步骤切换使用回内部目录管理你的用户. 如果你的 Confluence 站点只有少量 ...

  10. AIM Tech Round 3 (Div. 1) (构造,树形dp,费用流,概率dp)

    B. Recover the String 大意: 求构造01字符串使得子序列00,01,10,11的个数恰好为$a_{00},a_{01},a_{10},a_{11}$ 挺简单的构造, 注意到可以通 ...