UNPKG

avalon2

Version:

an elegant efficient express mvvm framework

756 lines (755 loc) 22.1 kB
<!doctype html> <html lang="en"> <head> <title>Code coverage report for vmodel/share.js</title> <meta charset="utf-8" /> <link rel="stylesheet" href="../prettify.css" /> <link rel="stylesheet" href="../base.css" /> <meta name="viewport" content="width=device-width, initial-scale=1"> <style type='text/css'> .coverage-summary .sorter { background-image: url(../sort-arrow-sprite.png); } </style> </head> <body> <div class='wrapper'> <div class='pad1'> <h1> <a href="../index.html">all files</a> / <a href="index.html">vmodel/</a> share.js </h1> <div class='clearfix'> <div class='fl pad1y space-right2'> <span class="strong">93.08% </span> <span class="quiet">Statements</span> <span class='fraction'>121/130</span> </div> <div class='fl pad1y space-right2'> <span class="strong">91.04% </span> <span class="quiet">Branches</span> <span class='fraction'>61/67</span> </div> <div class='fl pad1y space-right2'> <span class="strong">100% </span> <span class="quiet">Functions</span> <span class='fraction'>13/13</span> </div> <div class='fl pad1y space-right2'> <span class="strong">93.08% </span> <span class="quiet">Lines</span> <span class='fraction'>121/130</span> </div> </div> </div> <div class='status-line high'></div> <pre><table class="coverage"> <tr><td class="line-count quiet">1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231</td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-yes">154×</span> <span class="cline-any cline-yes">154×</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">153×</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">153×</span> <span class="cline-any cline-yes">153×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-yes">410×</span> <span class="cline-any cline-yes">410×</span> <span class="cline-any cline-yes">410×</span> <span class="cline-any cline-yes">410×</span> <span class="cline-any cline-yes">410×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">410×</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">410×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">410×</span> <span class="cline-any cline-yes">308×</span> <span class="cline-any cline-yes">308×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">102×</span> <span class="cline-any cline-yes">102×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-yes">257×</span> <span class="cline-any cline-yes">257×</span> <span class="cline-any cline-yes">257×</span> <span class="cline-any cline-yes">257×</span> <span class="cline-any cline-yes">257×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">257×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">257×</span> <span class="cline-any cline-yes">577×</span> <span class="cline-any cline-yes">154×</span> <span class="cline-any cline-yes">423×</span> <span class="cline-any cline-yes">423×</span> <span class="cline-any cline-yes">423×</span> <span class="cline-any cline-yes">361×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">257×</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">257×</span> <span class="cline-any cline-yes">257×</span> <span class="cline-any cline-yes">257×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-yes">433×</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-yes">431×</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">429×</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">425×</span> <span class="cline-any cline-yes">64×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">361×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-yes">644×</span> <span class="cline-any cline-yes">82×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">562×</span> <span class="cline-any cline-yes">562×</span> <span class="cline-any cline-yes">68×</span> <span class="cline-any cline-yes">494×</span> <span class="cline-any cline-yes">104×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">562×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-yes">145×</span> <span class="cline-any cline-yes">145×</span> <span class="cline-any cline-yes">145×</span> <span class="cline-any cline-yes">145×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">145×</span> <span class="cline-any cline-yes">294×</span> <span class="cline-any cline-yes">294×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">145×</span> <span class="cline-any cline-yes">145×</span> <span class="cline-any cline-yes">145×</span> <span class="cline-any cline-yes">145×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-yes">657×</span> <span class="cline-any cline-yes">657×</span> <span class="cline-any cline-yes">657×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">2815×</span> <span class="cline-any cline-yes">551×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">2815×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">291×</span> <span class="cline-any cline-yes">21×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">291×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-yes">1922×</span> <span class="cline-any cline-yes">1922×</span> <span class="cline-any cline-yes">348×</span> <span class="cline-any cline-yes">348×</span> <span class="cline-any cline-yes">1223×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">348×</span> <span class="cline-any cline-yes">1574×</span> <span class="cline-any cline-yes">851×</span> <span class="cline-any cline-yes">716×</span> <span class="cline-any cline-yes">716×</span> <span class="cline-any cline-yes">716×</span> <span class="cline-any cline-yes">1487×</span> <span class="cline-any cline-yes">1487×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">716×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">858×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">229×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-yes"></span></td><td class="text"><pre class="prettyprint lang-js">import { avalon, platform, isObject, modern } from '../seed/core' import { $$skipArray } from './reserved' import { Mutation } from './Mutation' import { Computed } from './Computed' &nbsp; &nbsp; /** * 这里放置ViewModel模块的共用方法 * avalon.define: 全框架最重要的方法,生成用户VM * IProxy, 基本用户数据产生的一个数据对象,基于$model与vmodel之间的形态 * modelFactory: 生成用户VM * canHijack: 判定此属性是否该被劫持,加入数据监听与分发的的逻辑 * createProxy: listFactory与modelFactory的封装 * createAccessor: 实现数据监听与分发的重要对象 * itemFactory: ms-for循环中产生的代理VM的生成工厂 * fuseFactory: 两个ms-controller间产生的代理VM的生成工厂 */ &nbsp; &nbsp; avalon.define = function(definition) { var $id = definition.$id if (!$id) { avalon.error('vm.$id must be specified') } if (avalon.vmodels[$id]) { avalon.warn('error:[' + $id + '] had defined!') } var vm = platform.modelFactory(definition) return avalon.vmodels[$id] = vm } &nbsp; /** * 在末来的版本,avalon改用Proxy来创建VM,因此 */ &nbsp; export function IProxy(definition, dd) { avalon.mix(this, definition) avalon.mix(this, $$skipArray) this.$hashcode = avalon.makeHashCode('$') this.$id = this.$id || this.$hashcode this.$events = { __dep__: dd || new Mutation(this.$id) } <span class="missing-if-branch" title="if path not taken" >I</span>if (avalon.config.inProxyMode) { <span class="cstat-no" title="statement not covered" > delete this.$mutations</span> <span class="cstat-no" title="statement not covered" > this.$accessors = {}</span> <span class="cstat-no" title="statement not covered" > this.$computed = {}</span> <span class="cstat-no" title="statement not covered" > this.$track = ''</span> } else { this.$accessors = { $model: modelAccessor } } if (dd === void 0) { this.$watch = platform.watchFactory(this.$events) this.$fire = platform.fireFactory(this.$events) } else { delete this.$watch delete this.$fire } } &nbsp; platform.modelFactory = function modelFactory(definition, dd) { var $computed = definition.$computed || {} delete definition.$computed var core = new IProxy(definition, dd) var $accessors = core.$accessors var keys = [] &nbsp; platform.hideProperty(core, '$mutations', {}) &nbsp; for (let key in definition) { if (key in $$skipArray) continue var val = definition[key] keys.push(key) if (canHijack(key, val)) { $accessors[key] = createAccessor(key, val) } } for (let key in $computed) { <span class="missing-if-branch" title="if path not taken" >I</span>if (key in $$skipArray) <span class="cstat-no" title="statement not covered" > continue</span> var val = $computed[key] if (typeof val === 'function') { val = { get: val } } <span class="missing-if-branch" title="else path not taken" >E</span>if (val &amp;&amp; val.get) { val.getter = val.get val.setter = val.set avalon.Array.ensure(keys, key) $accessors[key] = createAccessor(key, val, true) } } //将系统API以unenumerable形式加入vm, //添加用户的其他不可监听属性或方法 //重写$track //并在IE6-8中增添加不存在的hasOwnPropert方法 var vm = platform.createViewModel(core, $accessors, core) platform.afterCreate(vm, core, keys, !dd) return vm } var $proxyItemBackdoorMap = {} &nbsp; export function canHijack(key, val, $proxyItemBackdoor) { if (key in $$skipArray) return false if (key.charAt(0) === '$') { <span class="missing-if-branch" title="if path not taken" >I</span>if ($proxyItemBackdoor) { <span class="cstat-no" title="statement not covered" > if (!$proxyItemBackdoorMap[key]) {</span> <span class="cstat-no" title="statement not covered" > $proxyItemBackdoorMap[key] = 1</span> <span class="cstat-no" title="statement not covered" > avalon.warn(`ms-for中的变量${key}不再建议以$为前缀`)</span> } <span class="cstat-no" title="statement not covered" > return true</span> } return false } if (val == null) { avalon.warn('定义vmodel时' + key + '的属性值不能为null undefine') return true } if (/error|date|function|regexp/.test(avalon.type(val))) { return false } return !(val &amp;&amp; val.nodeName &amp;&amp; val.nodeType) } &nbsp; export function createProxy(target, dd) { if (target &amp;&amp; target.$events) { return target } var vm if (Array.isArray(target)) { vm = platform.listFactory(target, false, dd) } else if (isObject(target)) { vm = platform.modelFactory(target, dd) } return vm } &nbsp; platform.createProxy = createProxy &nbsp; platform.itemFactory = function itemFactory(before, after) { var keyMap = before.$model var core = new IProxy(keyMap) var state = avalon.shadowCopy(core.$accessors, before.$accessors) //防止互相污染 var data = after.data //core是包含系统属性的对象 //keyMap是不包含系统属性的对象, keys for (var key in data) { var val = keyMap[key] = core[key] = data[key] state[key] = createAccessor(key, val) } var keys = Object.keys(keyMap) var vm = platform.createViewModel(core, state, core) platform.afterCreate(vm, core, keys) return vm } &nbsp; function createAccessor(key, val, isComputed) { var mutation = null var Accessor = isComputed ? Computed : Mutation return { get: function Getter() { if (!mutation) { mutation = new Accessor(key, val, this) } return mutation.get() }, set: function Setter(newValue) { if (!mutation) { mutation = new Accessor(key, val, this) } mutation.set(newValue) }, enumerable: true, configurable: true } } &nbsp; &nbsp; platform.fuseFactory = function fuseFactory(before, after) { var keyMap = avalon.mix(before.$model, after.$model) var core = new IProxy(avalon.mix(keyMap, { $id: before.$id + after.$id })) var state = avalon.mix(core.$accessors, before.$accessors, after.$accessors) //防止互相污染 &nbsp; var keys = Object.keys(keyMap) //将系统API以unenumerable形式加入vm,并在IE6-8中添加hasOwnPropert方法 var vm = platform.createViewModel(core, state, core) platform.afterCreate(vm, core, keys, false) return vm } &nbsp; function toJson(val) { var xtype = avalon.type(val) if (xtype === 'array') { var array = [] for (var i = 0; i &lt; val.length; i++) { array[i] = toJson(val[i]) } return array } else if (xtype === 'object') { if (typeof val.$track === 'string') { var obj = {} var arr = val.$track.match(/[^☥]+/g) || [] arr.forEach(function(i) { var value = val[i] obj[i] = value &amp;&amp; value.$events ? toJson(value) : value }) return obj } } return val } &nbsp; var modelAccessor = { get: function() { return toJson(this) }, set: avalon.noop, enumerable: false, configurable: true } &nbsp; platform.toJson = toJson platform.modelAccessor = modelAccessor</pre></td></tr> </table></pre> <div class='push'></div><!-- for sticky footer --> </div><!-- /wrapper --> <div class='footer quiet pad2 space-top1 center small'> Code coverage generated by <a href="http://istanbul-js.org/" target="_blank">istanbul</a> at Tue Dec 13 2016 18:10:11 GMT+0800 (CST) </div> </div> <script src="../prettify.js"></script> <script> window.onload = function () { if (typeof prettyPrint === 'function') { prettyPrint(); } }; </script> <script src="../sorter.js"></script> </body> </html>