上一篇文章讲述的avalon刷页面所用到的几个函数。这篇则是主要讲avalon对刷DOM刷出来的avalon自定义属性如何处理的。

目录[-]
avalon页面处理(2)
数据结构
解析avalon标签
parseExpr
parseExprProxy
函数介绍
createCache
小结
附录
测试demo avalon页面处理(2) 上一篇文章讲述的avalon刷页面所用到的几个函数。这篇则是主要讲avalon对刷DOM刷出来的avalon自定义属性如何处理的。 数据结构 看js代码最头疼的就是数据流转时的数据结构变化。 //attr bindings
//例如 <div ms-dbclick-_abc='func'></div>
{
type:$string,//也就是ms-...后面的信息,例如 ms-duplex 则为 type:duplex,注意,游览器事件(event)如click,mousemove等统一为type:on
param:$string//"_abc"
element:$node//当前节点
name:$string//ms-dbclick-_abc
value:$string//func
priority:$Num//优先级。
//"if": 10,
//"repeat": 90,
//"widget": 110,
//"each": 1400,
//"with": 1500,
//"duplex": 2000,
//"on": 3000
//值越大优先级越高
}
//text bindings 从上一篇拉过来
{
type: "text|html",//类型
node: node,//替换后的element
nodeType: 3,//节点类型
value: token.value,
filters: token.filters
replaceNodes:$array//[node]
//token 为scanExpr的返回值
}
//text token
{
value:$string//具体值
expr:$boolean//是不是在{{...}}内
filters:$array|void 0 //过滤器
}
//bindingHandlers data
{
handlerName:$name//被bindingHandlers中哪个方法执行了解析。由于href src等都通过attr来处理,所以通过bindings 的type属性不可靠
evaluator:$func//由parseExpr 生成的函数。
...//上面 的text bindings 和attr bindings
} 解析avalon标签 有了数据结构后,看源码就稍微轻松些了。解析标签的功能主要存在bindingHandlers对象内。bindingHandler主要是对avalon标签进行分类和按实际情况进行处理,就像做javascript UI 插件一样。他所用到两个很重要的函数分别是parseExprProxy和parseExpr。
parseExpr parseExpr的主要作用是根据ms-what、{{what}}、vmodule和先前定义的filters等生成Function,并存储在evaluator下(参看bindingHandlers data数据结构)。下面是各种生成后的 function整理。 //简单的绑定个属性 例如 ms-href={{name}}
function anonymous(vm1399087422863_0/**/) {
'use strict';
var name = vm1399087422863_0.name
return name;
}
//带有filter的,例如 {{name | uppercase}}
function anonymous(vm1399088892713_0,filters1399088892713/**/) {//filters1399088892713 会将所有现有filters作为key/value传递进来
'use strict';
var name = vm1399088892713_0.name
var ret1399088892713 = name
if(filters1399088892713.uppercase){
try{
ret1399088892713 = filters1399088892713.uppercase(ret1399088892713)
}catch(e){}
} return ret1399088892713
}
//ms-duplex='name'
function anonymous(vm1399091173121_0/**/) {
'use strict';
return function(vvv){
var name = vm1399091173121_0.name;
if(!arguments.length){
return name
}
vm1399091173121_0.name= vvv;
}
} //ms-on ms-click="click"
function anonymous(vm1399093434491_0/**/) {
'use strict';
var click = vm1399093434491_0.click
if(avalon.openComputedCollect) return ;
return click;
} 上面是三个分支(第一个function和第二个function属于同一分支)最基本的例子,复杂一些的也基本是以此做基础衍生出来的,自己可以尝试着看着以上代码写一些复杂点的function出 来,并和avalon生成的做对比。parseExpr在生成function的时候会涉及缓存生成函数和缓存函数的uniId生成。
缓存的源码和测试demo会在后面写上。
parseExprProxy parseExprProxy主要作用是通过调用parseExpr 生成function,然后进行相应的dom订阅。它还帮助parseExpr处理了类似ms-href='http://{{abc}}ff{{abd}}'的分支。至于如何dom订阅, 不属于本篇的范畴。
函数介绍
createCache createCache:创建固定大小缓存,直接拿来收藏好了。 function createCache(maxLength) {
var keys = [] function cache(key, value) {
if (keys.push(key) > maxLength) {
delete cache[keys.shift()]
}
return cache[key] = value;
}
return cache;
} var c= createCache(256);
//c("key","value")//value
//c("key")//value 小结 这篇篇幅较短,avalon关于DOM处理 ms-, {{...}}核心除了parseExpr函数外,还有bindingHandlers对象,而看这个代码真如看javascript UI 插件一样,没多大激情(当然,写的话就费 劲了),所以就不去细细讲述了。
附录
测试demo <!DOCTYPE html>
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script src="avalon.js"></script>
</head>
<body>
<div ms-controller="nihao">
<a ms-href='{{name}}'>abc</a>
{{name|uppercase}}
<input type='text' ms-duplex='name'/>
<button ms-click='click'>button</button>
<a ms-href='http://abc/{{name}}'>test parseExprProxy</a>
</div>
<script>
avalon.define("nihao", function(vm) {
vm.name='nihao'
vm.cla=true
vm.click=function(){
console.log("click!");
return
}
})
</script>
</body>
</html>

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

  1. xxl-job源码阅读二(服务端)

    1.源码入口 xxl-job-admin是一个简单的springboot工程,简单翻看源码,可以很快发现XxlJobAdminConfig入口. @Override public void after ...

  2. Spring 源码阅读 二

    程序入口: 接着上一篇博客中看完了在AnnotationConfigApplicationContext的构造函数中的register(annotatedClasses);将我们传递进来的主配置类添加 ...

  3. SparkConf加载与SparkContext创建(源码阅读二)

    紧接着昨天,我们继续开搞了啊.. 1.下面,开始创建BroadcastManager,就是传说中的广播变量管理器.BroadcastManager用于将配置信息和序列化后的RDD.Job以及Shuff ...

  4. JDK源码阅读(二) AbstractList

    package java.util; public abstract class AbstractList<E> extends AbstractCollection<E> i ...

  5. Struts2源码阅读(一)_Struts2框架流程概述

    1. Struts2架构图  当外部的httpservletrequest到来时 ,初始到了servlet容器(所以虽然Servlet和Action是解耦合的,但是Action依旧能够通过httpse ...

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

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

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

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

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

    [原]SDWebImage源码阅读(二) 本文转载请注明出处 —— polobymulberry-博客园 1. 解决上一篇遗留的坑 上一篇中对sd_setImageWithURL函数简单分析了一下,还 ...

  9. 34 网络相关函数(二)——live555源码阅读(四)网络

    34 网络相关函数(二)——live555源码阅读(四)网络 34 网络相关函数(二)——live555源码阅读(四)网络 2)socketErr 套接口错误 3)groupsockPriv函数 4) ...

  10. 【 js 基础 】【 源码学习 】backbone 源码阅读(二)

    最近看完了 backbone.js 的源码,这里对于源码的细节就不再赘述了,大家可以 star 我的源码阅读项目(source-code-study)进行参考交流,有详细的源码注释,以及知识总结,同时 ...

随机推荐

  1. [洛谷P4819][中山市选]杀人游戏

    题目大意:有一张$n$个点$m$条边的有向图,有一个关键点,如果你访问一个点,你会知道它连出的边中有没有关键点,以及若有的话是哪个.问最优策略下不访问关键点而知道关键点的概率 题解:发现若一个点不是关 ...

  2. PHP-从零开始使用Solr搜索引擎服务(下)

    前言: 原文地址: http://www.cnblogs.com/JimmyBright/p/7156085.html 前面在配置完成Solr服务之后,在浏览器上可以打开Solr的管理界面,这个界面几 ...

  3. java多线程 -- ConcurrentHashMap 锁分段 机制

    hashtable效率低ConcurrentHashMap 线程安全,效率高 Java 5.0 在 java.util.concurrent 包中提供了多种并发容器类来改进同步容器 的性能. Conc ...

  4. 解决Android SDK Manager更新时出现问题

    使用SDK Manager更新时出现问题Failed to fetch URL https://dl-ssl.google.com/android/repository/repository-6.xm ...

  5. 【DP】【P4539】 [SCOI2006]zh_tree

    Description 张老师根据自己工作的需要,设计了一种特殊的二叉搜索树. 他把这种二叉树起名为zh_tree,对于具有n个结点的zh_tree,其中序遍历恰好为(1,2,3,-,n),其中数字1 ...

  6. python对MySQL的CRUD

    我是闲的没事干,2014过的太浮夸了,博客也没写几篇,哎~~~ 用这篇来记录即将逝去的2014 python对各种数据库的各种操作满大街都是,不过,我还是喜欢我这种风格的,涉及到其它操作,不过重点还是 ...

  7. linux命令总结kill命令详解

    1.作用 kill命令用来中止一个进程. 2.格式 kill [ -s signal | -p ] [ -a ] pid ... kill -l [ signal ] 3.参数 -s:指定发送的信号. ...

  8. python 导入自定义模块

    1. 2.

  9. Java操作Kafka执行不成功的解决方法,Kafka Broker Advertised.Listeners属性的设置

    创建Spring Boot项目继承Kafka,向Kafka发送消息始终不成功.具体项目配置如下: <?xml version="1.0" encoding="UTF ...

  10. MAC下 Apache服务器配置

    今天做了一个注册登录提交的页面,后续操作需要用到后端的知识 php+Mysql,之前只是有些了解,现在开始具体操作了,首先从配置环境开始.查了好几篇文档与博客,了解了挺多知识. Mac下Apache服 ...