**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:繼承掃描