ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
**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:继承扫描