UNPKG

avalon2

Version:

an elegant efficient express mvvm framework

711 lines (709 loc) 20.7 kB
<!doctype html> <html lang="en"> <head> <title>Code coverage report for directives/duplex/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">directives/duplex/</a> share.js </h1> <div class='clearfix'> <div class='fl pad1y space-right2'> <span class="strong">100% </span> <span class="quiet">Statements</span> <span class='fraction'>127/127</span> </div> <div class='fl pad1y space-right2'> <span class="strong">89.55% </span> <span class="quiet">Branches</span> <span class='fraction'>60/67</span> </div> <div class='fl pad1y space-right2'> <span class="strong">100% </span> <span class="quiet">Functions</span> <span class='fraction'>14/14</span> </div> <div class='fl pad1y space-right2'> <span class="strong">100% </span> <span class="quiet">Lines</span> <span class='fraction'>127/127</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</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-yes"></span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-yes">35×</span> <span class="cline-any cline-yes">35×</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">35×</span> <span class="cline-any cline-yes">35×</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">35×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-yes">32×</span> <span class="cline-any cline-yes">32×</span> <span class="cline-any cline-yes">32×</span> <span class="cline-any cline-yes">32×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">32×</span> <span class="cline-any cline-yes">32×</span> <span class="cline-any cline-yes">32×</span> <span class="cline-any cline-yes">16×</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">16×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">32×</span> <span class="cline-any cline-yes">32×</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-yes">32×</span> <span class="cline-any cline-yes">32×</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">31×</span> <span class="cline-any cline-yes">26×</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">32×</span> <span class="cline-any cline-yes">32×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">32×</span> <span class="cline-any cline-yes">19×</span> <span class="cline-any cline-yes">19×</span> <span class="cline-any cline-yes">13×</span> <span class="cline-any cline-yes">13×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">32×</span> <span class="cline-any cline-yes">32×</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">78×</span> <span class="cline-any cline-yes">21×</span> <span class="cline-any cline-yes">21×</span> <span class="cline-any cline-yes">21×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">57×</span> <span class="cline-any cline-yes">57×</span> <span class="cline-any cline-yes">47×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">57×</span> <span class="cline-any cline-yes">56×</span> <span class="cline-any cline-yes">56×</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-neutral">&nbsp;</span> <span class="cline-any cline-yes">32×</span> <span class="cline-any cline-yes">32×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">32×</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-yes">15×</span> <span class="cline-any cline-yes">15×</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"></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-neutral">&nbsp;</span> <span class="cline-any cline-yes">10×</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-yes"></span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-yes">84×</span> <span class="cline-any cline-yes">84×</span> <span class="cline-any cline-yes">84×</span> <span class="cline-any cline-yes">30×</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-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"></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-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">69×</span> <span class="cline-any cline-yes">28×</span> <span class="cline-any cline-yes">28×</span> <span class="cline-any cline-yes">28×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">69×</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">28×</span> <span class="cline-any cline-yes">28×</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">36×</span> <span class="cline-any cline-yes">36×</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">18×</span> <span class="cline-any cline-yes">18×</span> <span class="cline-any cline-yes">18×</span> <span class="cline-any cline-yes">18×</span> <span class="cline-any cline-yes">10×</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">18×</span> <span class="cline-any cline-yes">18×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">18×</span> <span class="cline-any cline-yes">18×</span> <span class="cline-any cline-yes">18×</span> <span class="cline-any cline-yes">18×</span> <span class="cline-any cline-yes">18×</span> <span class="cline-any cline-yes">29×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">18×</span> <span class="cline-any cline-yes">18×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">11×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">11×</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-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-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></td><td class="text"><pre class="prettyprint lang-js">import { avalon, createFragment } from '../../seed/core' import { rcheckedType } from '../../dom/rcheckedType' import { lookupOption } from './option' import { addScope, makeHandle } from '../../parser/index' import { fromString } from '../../vtree/fromString' &nbsp; &nbsp; var rchangeFilter = /\|\s*change\b/ var rdebounceFilter = /\|\s*debounce(?:\(([^)]+)\))?/ export function duplexBeforeInit() { var expr = this.expr if (rchangeFilter.test(expr)) { this.isChanged = true expr = expr.replace(rchangeFilter, '') } var match = expr.match(rdebounceFilter) if (match) { expr = expr.replace(rdebounceFilter, '') <span class="missing-if-branch" title="else path not taken" >E</span>if (!this.isChanged) { this.debounceTime = parseInt(match[1], 10) || 300 } } this.expr = expr } export function duplexInit() { var expr = this.expr var node = this.node var etype = node.props.type this.parseValue = parseValue //处理数据转换器 var parsers = this.param, dtype var isChecked = false parsers = parsers ? parsers.split('-').map(function (a) { if (a === 'checked') { isChecked = true } return a }) : [] node.duplex = this if (rcheckedType.test(etype) &amp;&amp; isChecked) { //如果是radio, checkbox,判定用户使用了checked格式函数没有 parsers = [] dtype = 'radio' this.isChecked = isChecked } this.parsers = parsers if (!/input|textarea|select/.test(node.nodeName)) { <span class="missing-if-branch" title="else path not taken" >E</span>if ('contenteditable' in node.props) { dtype = 'contenteditable' } } else if (!dtype) { dtype = node.nodeName === 'select' ? 'select' : etype === 'checkbox' ? 'checkbox' : etype === 'radio' ? 'radio' : 'input' } this.dtype = dtype var isChanged = false, debounceTime = 0 //判定是否使用了 change debounce 过滤器 // this.isChecked = /boolean/.test(parsers) if (dtype !== 'input' &amp;&amp; dtype !== 'contenteditable') { delete this.isChange delete this.debounceTime } else <span class="missing-if-branch" title="else path not taken" >E</span>if (!this.isChecked) { this.isString = true } &nbsp; var cb = node.props['data-duplex-changed'] if (cb) { var arr = addScope(cb, 'xx') var body = makeHandle(arr[0]) this.userCb = new Function('$event', 'var __vmodel__ = this\nreturn ' + body) } &nbsp; } export function duplexDiff(newVal, oldVal) { if (Array.isArray(newVal)) { <span class="missing-if-branch" title="else path not taken" >E</span>if (newVal + '' !== this.compareVal) { this.compareVal = newVal + '' return true } } else { newVal = this.parseValue(newVal) if (!this.isChecked) { this.value = newVal += '' } if (newVal !== this.compareVal) { this.compareVal = newVal return true } } &nbsp; } &nbsp; &nbsp; export function duplexValidate(node, vdom) { //将当前虚拟DOM的duplex添加到它上面的表单元素的validate指令的fields数组中 var field = vdom.duplex var rules = vdom.rules &nbsp; if (rules &amp;&amp; !field.validator) { while (node &amp;&amp; node.nodeType === 1) { var validator = node._ms_validate_ if (validator) { field.rules = rules field.validator = validator &nbsp; <span class="missing-if-branch" title="else path not taken" >E</span>if (avalon.Array.ensure(validator.fields, field)) { validator.addField(field) } break } node = node.parentNode } } } &nbsp; &nbsp; export var valueHijack = true try { //#272 IE9-IE11, firefox var setters = {} var aproto = HTMLInputElement.prototype var bproto = HTMLTextAreaElement.prototype var newSetter = function (value) { // jshint ignore:line setters[this.tagName].call(this, value) var data = this._ms_duplex_ if (!this.caret &amp;&amp; data &amp;&amp; data.isString) { data.duplexCb.call(this, { type: 'setter' }) } } var inputProto = HTMLInputElement.prototype Object.getOwnPropertyNames(inputProto) //故意引发IE6-8等浏览器报错 setters['INPUT'] = Object.getOwnPropertyDescriptor(aproto, 'value').set &nbsp; Object.defineProperty(aproto, 'value', { set: newSetter }) setters['TEXTAREA'] = Object.getOwnPropertyDescriptor(bproto, 'value').set Object.defineProperty(bproto, 'value', { set: newSetter }) valueHijack = false } catch (e) { //在chrome 43中 ms-duplex终于不需要使用定时器实现双向绑定了 // http://updates.html5rocks.com/2015/04/DOM-attributes-now-on-the-prototype // https://docs.google.com/document/d/1jwA8mtClwxI-QJuHT7872Z0pxpZz8PBkf2bGAbsUtqs/edit?pli=1 } &nbsp; function parseValue(val) { for (var i = 0, k; k = this.parsers[i++];) { var fn = avalon.parsers[k] <span class="missing-if-branch" title="else path not taken" >E</span>if (fn) { val = fn.call(this, val) } } return val } &nbsp; export var updateView = { input: function () {//处理单个value值处理 this.node.props.value = this.value + '' this.dom.value = this.value &nbsp; }, updateChecked: function (vdom, checked) { <span class="missing-if-branch" title="else path not taken" >E</span>if (vdom.dom) { vdom.dom.defaultChecked = vdom.dom.checked = checked } }, radio: function () {//处理单个checked属性 var node = this.node var nodeValue = node.props.value var checked if (this.isChecked) { checked = !!this.value } else { checked = this.value + '' === nodeValue } node.props.checked = checked updateView.updateChecked(node, checked) }, checkbox: function () {//处理多个checked属性 var node = this.node var props = node.props var value = props.value+'' var values = [].concat(this.value) var checked = values.some(function (el) { return el + ''=== value }) props.defaultChecked = props.checked = checked updateView.updateChecked(node, checked) }, select: function () {//处理子级的selected属性 var a = Array.isArray(this.value) ? this.value.map(String) : this.value + '' lookupOption(this.node, a) }, contenteditable: function () {//处理单个innerHTML &nbsp; var vnodes = fromString(this.value) var fragment = createFragment() for (var i = 0, el; el = vnodes[i++];) { var child = avalon.vdom(el, 'toDOM') fragment.appendChild(child) } avalon.clearHTML(this.dom).appendChild(fragment) var list = this.node.children list.length = 0 Array.prototype.push.apply(list, vnodes) &nbsp; this.duplexCb.call(this.dom) } } &nbsp; &nbsp;</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>