**1 标签扫描源代码(18 scanTag.js)**
~~~
function scanTag(elem, vmodels, node) {
var a = elem.getAttribute("ms-skip")
var b = elem.getAttributeNode("ms-important")
var c = elem.getAttributeNode("ms-controller")
if (typeof a === "string") {
return
} else if (node = b || c) {
var newVmodel = avalon.vmodels[node.value]
if (!newVmodel) {
return
}
vmodels = node === b ? [newVmodel] : [newVmodel].concat(vmodels)
elem.removeAttribute(node.name)
elem.classList.remove(node.name)
createSignalTower(elem, newVmodel)
}
scanAttr(elem, vmodels)
}
~~~
**2 文件分析**
`function scanTag(elem, vmodels, node) {}`
>[info] scanTag()完成elem标签内容的扫描,并添加信息到vmodels中
elem:待扫描标签入口
vmodels:可合并vmodel信息
node:??
~~~
var a = elem.getAttribute("ms-skip")
var b = elem.getAttributeNode("ms-important")
var c = elem.getAttributeNode("ms-controller")
~~~
>[info] a,b,c分别是ms-skip,ms-important,ms-controller三个属性
ms-skip:忽略扫描
ms-important:扫描信息不继承
ms-controller:扫描信息可以继承
>[info] getAttribute,getAttributeNode见基础原理的DOM接口
`if (typeof a === "string") {`
>[info] skip标签 直接返回,不扫描
`} else if (node = b || c) {`
>[info] important controller标签 进行扫描处理
node赋值为获取的属性对象,属性对象间基础原理的DOM接口
`var newVmodel = avalon.vmodels[node.value]`
>[info] 根据属性对象可知node.value的值是属性的值,如下面的一段代码。
node.value即为model。所也就是avalon.define()的$id参数。根据avalon.define可知,$id是vmodels数组对应vmodel的索引。
~~~
<div ms-controller="model">
</div>
~~~
~~~
if (!newVmodel) {
return
}
~~~
>[info] 获取vmodel失败直接返回,也就是说扫描当前标签没有可以保存vmodel。
`vmodels = node === b ? [newVmodel] : [newVmodel].concat(vmodels)`
>[info] 等价于 if(node===b){[newVmodel]]}else if(node===c){[newVmodel].concat(vmodels)}
所以ms-important 属性值标签不继承
ms-controller 属性值标签可以继承
`elem.removeAttribute(node.name)`
>[info]移除elem的ms-skip/ms-important/ms-controller属性。这里修改了标签的属性信息
`elem.classList.remove(node.name)`
>[info]移除elem的class样式控制的ms-skip/ms-important/ms-controller属性。这里修改标签的css
`createSignalTower(elem, newVmodel)`
>[info] 这里调用scan.js文件定义的createSignaTower()接口
分析可知为elem添加了avalonctrl属性,
并且在vmodel的$events设置了expr属性。
>[info] 上面的一段代码用来分析标签的ms-skip,ms-importan,ms-controller三个属性,这三个属性是v层的入口标记。
`scanAttr(elem,vmodels)`
>[info] 进入普通属性的扫描
**3 总结**
ms-skip:忽略标签内容扫描
ms-important:不继承扫描
ms-controller:继承扫描