diff --git a/build.next.js b/build.next.js index 4252e02..7827c69 100644 --- a/build.next.js +++ b/build.next.js @@ -4,18 +4,13 @@ const log = console.log const fs = require('iofs') const path = require('path') const scss = require('node-sass') -const postcss = require('postcss') -const autoprefixer = require('autoprefixer') + const chalk = require('chalk') const uglify = require('uglify-es') const sourceDir = path.resolve(__dirname, 'src') const buildDir = path.resolve(__dirname, 'dist') -const prefixer = postcss().use( - autoprefixer({ - browsers: ['ie > 9', 'iOS > 8', 'Android >= 4.4', 'ff > 38', 'Chrome > 38'] - }) -) + const cssOpt = { includePaths: ['src/css/'], outputStyle: 'compressed' @@ -79,8 +74,8 @@ if (fs.isdir(buildDir)) { // css目录 cssFiles.forEach(file => { if (/\.scss$/.test(file)) { - let entry = path.resolve(sourceDir, 'css/', file) - let output = path.resolve(buildDir, 'css/', file.replace(/scss$/, 'css')) + let entry = file + let output = file.replace('src/css', 'dist/css').replace(/scss$/, 'css') compileCss(entry, output) } @@ -88,8 +83,8 @@ cssFiles.forEach(file => { // js目录的处理要复杂一点 jsFiles.forEach(file => { - let entry = path.resolve(sourceDir, 'js', file) - let output = path.resolve(buildDir, 'js', file) + let entry = file + let output = file.replace(/src\/js/, 'dist/js').replace(/scss$/, 'css') let ext = file.slice(file.lastIndexOf('.') + 1) switch (ext) { @@ -97,7 +92,6 @@ jsFiles.forEach(file => { compileJs(entry, output) break case 'scss': - output = output.replace(/scss$/, 'css') compileCss(entry, output) break case 'htm': diff --git a/build.prod.js b/build.prod.js index f5a487d..4fba640 100644 --- a/build.prod.js +++ b/build.prod.js @@ -93,8 +93,8 @@ if (fs.isdir(buildDir)) { // css目录 cssFiles.forEach(file => { if (/\.scss$/.test(file)) { - let entry = path.resolve(sourceDir, 'css/', file) - let output = path.resolve(buildDir, 'css/', file.replace(/scss$/, 'css')) + let entry = file + let output = file.replace('src/css', 'dist/css').replace(/scss$/, 'css') compileCss(entry, output) } @@ -102,8 +102,8 @@ cssFiles.forEach(file => { // js目录的处理要复杂一点 jsFiles.forEach(file => { - let entry = path.resolve(sourceDir, 'js', file) - let output = path.resolve(buildDir, 'js', file) + let entry = file + let output = file.replace(/src\/js/, 'dist/js').replace(/scss$/, 'css') let ext = file.slice(file.lastIndexOf('.') + 1) switch (ext) { @@ -111,7 +111,6 @@ jsFiles.forEach(file => { compileJs(entry, output) break case 'scss': - output = output.replace(/scss$/, 'css') compileCss(entry, output) break case 'htm': diff --git a/package.json b/package.json index 0897326..45d0a56 100644 --- a/package.json +++ b/package.json @@ -21,14 +21,14 @@ "dependencies": { "autoprefixer": "^7.2.6", "babel-core": "^6.26.3", - "babel-plugin-transform-decorators-legacy": "^1.3.4", + "babel-plugin-transform-decorators-legacy": "^1.3.5", "babel-plugin-transform-es2015-classes": "^6.24.1", "babel-plugin-transform-es2015-for-of": "^6.23.0", "babel-plugin-transform-object-rest-spread": "^6.26.0", "babel-preset-es2015": "^6.24.1", "chalk": "^2.4.1", "chokidar": "^1.7.0", - "iofs": "^1.0.3", + "iofs": "^1.1.0", "node-sass": "^4.9.0", "postcss": "^6.0.22", "uglify-es": "^3.3.9" diff --git a/src/css/basic-elem.css b/src/css/basic-elem.css deleted file mode 100644 index a7ebba5..0000000 --- a/src/css/basic-elem.css +++ /dev/null @@ -1 +0,0 @@ -.do-ui-button{display:inline-block;padding:2px 5px;border:1px solid #ddd;text-align:center;font-size:12px;background:none;cursor:pointer;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.do-ui-button.medium{min-width:100px;height:35px;padding:0 8px;line-height:35px;font-size:15px}.do-ui-button.large{min-width:150px;height:50px;padding:0 13px;line-height:50px;font-size:18px}.do-ui-button.radius-3{border-radius:3px}.do-ui-button.radius-3 [class^="do-icon-"],.do-ui-button.radius-3 [class*=" do-icon-"]{border-radius:3px}.do-ui-button.radius-5{border-radius:5px}.do-ui-button.radius-5 [class^="do-icon-"],.do-ui-button.radius-5 [class*=" do-icon-"]{border-radius:3px}.do-ui-button.teal{border:0;background:#1abc9c;color:#fff}.do-ui-button.teal:hover{background:#48c9b0}.do-ui-button.teal:active{background:#16a085}.do-ui-button.green{border:0;background:#4caf50;color:#fff}.do-ui-button.green:hover{background:#81c784}.do-ui-button.green:active{background:#388e3c}.do-ui-button.blue{border:0;background:#2196f3;color:#fff}.do-ui-button.blue:hover{background:#64b5f6}.do-ui-button.blue:active{background:#1976d2}.do-ui-button.purple{border:0;background:#651fff;color:#fff}.do-ui-button.purple:hover{background:#7c4dff}.do-ui-button.purple:active{background:#6200ea}.do-ui-button.red{border:0;background:#ff5722;color:#fff}.do-ui-button.red:hover{background:#ff7043}.do-ui-button.red:active{background:#e64a19}.do-ui-button.orange{border:0;background:#ff9800;color:#fff}.do-ui-button.orange:hover{background:#ffa726}.do-ui-button.orange:active{background:#f57c00}.do-ui-button.plain{border:0;background:#e7e8eb;color:#546e7a}.do-ui-button.plain:hover{background:#ecf0f1}.do-ui-button.plain:active{background:#d3d5db}.do-ui-button.grey{border:0;background:#546e7a;color:#fff}.do-ui-button.grey:hover{background:#607d8b}.do-ui-button.grey:active{background:#37474f}.do-ui-button.disabled{border-color:#e7e8eb;color:#d3d5db;cursor:not-allowed}.do-ui-button.medium.with-icon,.do-ui-button.large.with-icon{position:relative;padding-left:43px}.do-ui-button.medium.with-icon [class^="do-icon-"],.do-ui-button.medium.with-icon [class*=" do-icon-"],.do-ui-button.large.with-icon [class^="do-icon-"],.do-ui-button.large.with-icon [class*=" do-icon-"]{position:absolute;left:0;top:0;width:35px;font-size:25px;background:rgba(0,0,0,0.1)}.do-ui-button.large.with-icon{padding-left:58px}.do-ui-button.large.with-icon [class^="do-icon-"],.do-ui-button.large.with-icon [class*=" do-icon-"]{width:50px;font-size:35px}.do-ui-input{position:relative;min-height:30px;padding:0 5px;border:1px solid #d3d5db;background:#fff;color:#546e7a;outline:none;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.do-ui-input::-webkit-input-placeholder{color:#d3d5db}.do-ui-input.area{padding:5px}.do-ui-input.radius-3{border-radius:3px}.do-ui-input.radius-5{border-radius:5px}.do-ui-input:focus,.do-ui-input:hover{border-color:#1abc9c}.do-ui-input.alert{border-color:#ff5722;color:#ff5722}.do-ui-input.alert input{color:#ff5722}.do-ui-input.disabled{border-color:transparent;background:#e7e8eb;color:#d3d5db}.do-ui-input.with-icon{display:inline-block;padding:0}.do-ui-input.with-icon input{width:100%;height:100%;min-height:30px;padding:0 30px 0 5px;border:0;background:transparent}.do-ui-input.with-icon [class^="do-icon-"],.do-ui-input.with-icon [class*=" do-icon-"]{position:absolute;right:0;top:0;width:30px;line-height:30px;font-size:22px}.do-ui-select{display:inline-block;min-height:30px;padding:0 30px 0 10px;border:0;border-bottom:1px solid #e7e7e7;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAMAAABV0m3JAAAADFBMVEUAAAD///+Pj4+JiYkxcGihAAAABHRSTlMAABBwqVQF9wAAADNJREFUeNqlzjEOACAMw8DQ/v/PSE5FFhaEx5usdekBuzRVH0RtCqJYELUFrVjQigX/5jdvzgDh9izlMQAAAABJRU5ErkJggg==) no-repeat right 8px;color:#546e7a;outline:none;-webkit-appearance:none;-moz-appearance:none;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.do-ui-select::-ms-expand{display:none}.do-ui-select:focus{border-color:#1abc9c}.do-ui-select.alert{border-color:#ff5722;color:#ff5722}.do-ui-select.disabled{border-color:transparent;background:#e7e8eb;color:#d3d5db}.do-ui-radio,.do-ui-checkbox{display:inline-block;position:relative;width:auto;height:auto;min-height:30px;padding-left:35px;line-height:30px;border-radius:3px;color:#546e7a}.do-ui-radio{padding-left:50px}.do-ui-radio>input{position:absolute;left:10px;top:10px;width:35px;height:10px;border-radius:10px;border:0;background:#d3d5db;-webkit-appearance:none;-moz-appearance:none}.do-ui-radio>input:checked{background:#d3d5db}.do-ui-radio>input:disabled{background:#ecf0f1}.do-ui-radio>input:disabled:checked{background:#d3d5db}.do-ui-radio>input::after{position:absolute;display:block;left:-2px;top:-5px;width:20px;height:20px;border-radius:50%;content:"";background:#ecf0f1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.2);box-shadow:0 1px 2px rgba(0,0,0,0.2)}.do-ui-radio>input:checked::after{left:auto;right:-2px;background:#607d8b}.do-ui-radio>input:checked:disabled::after{background:#d3d5db}.do-ui-radio.green>input:checked{background:#81c784}.do-ui-radio.green>input:checked::after{background:#388e3c}.do-ui-radio.teal>input:checked{background:#81c784}.do-ui-radio.teal>input:checked::after{background:#16a085}.do-ui-radio.blue>input:checked{background:#64b5f6}.do-ui-radio.blue>input:checked::after{background:#1976d2}.do-ui-radio.purple>input:checked{background:#64b5f6}.do-ui-radio.purple>input:checked::after{background:#6200ea}.do-ui-radio.red>input:checked{background:#ff7043}.do-ui-radio.red>input:checked::after{background:#e64a19}.do-ui-radio.orange>input:checked{background:#ffa726}.do-ui-radio.orange>input:checked::after{background:#f57c00}.do-ui-radio.grey>input:checked{background:#607d8b}.do-ui-radio.grey>input:checked::after{background:#37474f}.do-ui-radio.disabled{color:#d3d5db}.do-ui-checkbox>input{position:absolute;left:2px;top:2px;width:26px;height:26px;line-height:22px;border:2px solid #d3d5db;border-radius:3px;text-align:center;font-size:18px;font-family:"ui font" !important;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-appearance:none;-moz-appearance:none}.do-ui-checkbox>input:checked::after{content:"\e60f"}.do-ui-checkbox>input:disabled{border-color:#d3d5db;color:#d3d5db}.do-ui-checkbox.green>input{color:#4caf50 !important;border-color:#4caf50}.do-ui-checkbox.teal>input{color:#1abc9c !important;border-color:#1abc9c}.do-ui-checkbox.purple>input{color:#651fff !important;border-color:#651fff}.do-ui-checkbox.blue>input{color:#2196f3 !important;border-color:#2196f3}.do-ui-checkbox.red>input{color:#ff5722 !important;border-color:#ff5722}.do-ui-checkbox.orange>input{color:#ff9800 !important;border-color:#ff9800}.do-ui-checkbox.grey>input{color:#546e7a !important;border-color:#546e7a}.do-ui-checkbox.disabled{color:#d3d5db}.do-ui-checkbox.with-style{padding-left:5px;padding-right:35px;line-height:26px;border:2px solid #e7e8eb;background:#e7e8eb;text-align:center}.do-ui-checkbox.with-style>input{left:auto;right:0;top:0;line-height:26px;border:0;background:#fff;color:#607d8b}.do-ui-checkbox.with-style>input:disabled{color:#d3d5db !important}.do-ui-checkbox.with-style.green{border-color:#4caf50;background:#4caf50;color:#fff}.do-ui-checkbox.with-style.teal{border-color:#1abc9c;background:#1abc9c;color:#fff}.do-ui-checkbox.with-style.purple{border-color:#651fff;background:#651fff;color:#fff}.do-ui-checkbox.with-style.blue{border-color:#2196f3;background:#2196f3;color:#fff}.do-ui-checkbox.with-style.red{border-color:#ff5722;background:#ff5722;color:#fff}.do-ui-checkbox.with-style.orange{border-color:#ff9800;background:#ff9800;color:#fff}.do-ui-checkbox.with-style.grey{border-color:#546e7a;background:#546e7a;color:#fff}.do-ui-checkbox.with-style.disabled{border-color:#e7e8eb;background:#e7e8eb;color:#d3d5db}.do-ui-quote{display:block;position:relative;min-height:60px;margin:10px 0;padding:15px 5px 5px 50px;border:1px solid #ddd;border-radius:10px;background:#f7f7f7;word-break:break-all}.do-ui-quote::before{position:absolute;left:8px;top:0;font:30px/1.5 "ui font";color:#d3d5db;content:"\e61b"}.do-ui-warn,.do-ui-mark{display:inline-block;position:relative;min-height:40px;margin:5px 0;padding:5px 8px 5px 50px;border:1px solid #ff9800;border-radius:5px;background:#fffbed;color:#f57c00;word-break:break-all}.do-ui-warn p,.do-ui-mark p{margin:0 !important}.do-ui-warn::before,.do-ui-mark::before{position:absolute;left:15px;top:5px;font:20px/1.5 "ui font";color:#ff5722;content:"\e6f6"}.do-ui-mark{border-color:#48c9b0;color:#16a085;background:#edfbf8}.do-ui-mark::before{color:#16a085;content:"\e657"} diff --git a/src/css/reset.scss b/src/css/reset-basic.scss similarity index 99% rename from src/css/reset.scss rename to src/css/reset-basic.scss index 7fe56f8..9ac6075 100644 --- a/src/css/reset.scss +++ b/src/css/reset-basic.scss @@ -39,7 +39,7 @@ a:focus,input,button:focus,input:focus {outline:none;} ::-moz-focus-inner { border:none;outline:none; } -[anot],[\:if],do-* {visibility:hidden;} +[anot],[\:if] {visibility:hidden;} .do-fn-cl { *zoom: 1; } .do-fn-cl::after { content: "."; display: block; height: 0; clear: both; visibility: hidden; overflow:hidden;} diff --git a/src/css/reset.css b/src/css/reset.css deleted file mode 100644 index 527e48f..0000000 --- a/src/css/reset.css +++ /dev/null @@ -1 +0,0 @@ -@font-face{font-family:"uifont";src:url("data:application/x-font-woff;charset=utf-8;base64,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") format("woff")}*{margin:0;padding:0;vertical-align:baseline;-webkit-box-sizing:border-box;box-sizing:border-box}::before,::after{-webkit-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section,content{display:block}img{border:0;display:inline-block}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote::before,blockquote::after,q::before,q::after{content:'';content:none}table{border-collapse:collapse;border-spacing:0}a:focus,input,button:focus,input:focus{outline:none}::-moz-focus-inner{border:none;outline:none}[anot],[\:if],do-*{visibility:hidden}.do-fn-cl{*zoom:1}.do-fn-cl::after{content:".";display:block;height:0;clear:both;visibility:hidden;overflow:hidden}.do-fn-clear{clear:both;display:inline}.do-fn-show{display:block}.do-fn-hide{display:none}.do-fn-fl{float:left}.do-fn-fr{float:right}.do-fn-noselect{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.do-fn-noselect img,.do-fn-noselect a{-webkit-user-drag:none}.do-fn-ell{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.do-st-thin{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.do-st-hand{cursor:pointer}[class^="do-icon-"],[class*=" do-icon-"]{display:inline-block;font-family:"uifont" !important;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.do-icon-info:before{content:"\e673"}.do-icon-bad:before{content:"\e674"}.do-icon-deny:before{content:"\e676"}.do-icon-calendar:before{content:"\e675"}.do-icon-email:before{content:"\e677"}.do-icon-eye:before{content:"\e678"}.do-icon-face:before{content:"\e67c"}.do-icon-fly:before{content:"\e679"}.do-icon-floppy:before{content:"\e67a"}.do-icon-good:before{content:"\e67b"}.do-icon-headset:before{content:"\e67d"}.do-icon-help:before{content:"\e67e"}.do-icon-list:before{content:"\e682"}.do-icon-lock:before{content:"\e683"}.do-icon-menu-left:before{content:"\e684"}.do-icon-menu-right:before{content:"\e685"}.do-icon-minimize:before{content:"\e686"}.do-icon-phone:before{content:"\e688"}.do-icon-picture:before{content:"\e689"}.do-icon-pipe:before{content:"\e68a"}.do-icon-plus:before{content:"\e68b"}.do-icon-quote:before{content:"\e68d"}.do-icon-table:before{content:"\e690"}.do-icon-talk:before{content:"\e691"}.do-icon-time:before{content:"\e692"}.do-icon-download:before{content:"\e694"}.do-icon-upload:before{content:"\e695"}.do-icon-male:before{content:"\e696"}.do-icon-female:before{content:"\e697"}.do-icon-left:before{content:"\e698"}.do-icon-dbl-left:before{content:"\e699"}.do-icon-right:before{content:"\e69a"}.do-icon-dbl-right:before{content:"\e69b"}.do-icon-pin:before{content:"\e69c"}.do-icon-edit:before{content:"\e69d"}.do-icon-home:before{content:"\e69e"}.do-icon-chart:before{content:"\e69f"}.do-icon-folder-close:before{content:"\e6a0"}.do-icon-txt:before{content:"\e6a1"}.do-icon-folder-open:before{content:"\e6a2"}.do-icon-qr:before{content:"\e6a3"}.do-icon-setting:before{content:"\e6a4"}.do-icon-mute:before{content:"\e6a5"}.do-icon-chat:before{content:"\e6a6"}.do-icon-font:before{content:"\e6a7"}.do-icon-unmute:before{content:"\e6a8"}.do-icon-search:before{content:"\e6a9"}.do-icon-sad:before{content:"\e6aa"}.do-icon-trash:before{content:"\e6ab"}.do-icon-happy:before{content:"\e6ac"}.do-icon-share:before{content:"\e6ad"}.do-icon-tag:before{content:"\e6ae"}.do-icon-app2:before{content:"\e6af"}.do-icon-app1:before{content:"\e6b0"}.do-icon-logout:before{content:"\e6b1"}.do-icon-menu-dot:before{content:"\e6b2"}.do-icon-trigon-up:before{content:"\e6b3"}.do-icon-trigon-down:before{content:"\e6b4"}.do-icon-loading:before{content:"\e6b5"}.do-icon-position:before{content:"\e6b6"}.do-icon-warn:before{content:"\e6b7"}.do-icon-bell:before{content:"\e6b8"}.do-icon-close:before{content:"\e6b9"}.do-icon-fire:before{content:"\e6ba"}.do-icon-user:before{content:"\e6bb"}.do-icon-icon-list:before{content:"\e6bc"}.do-icon-star:before{content:"\e6bd"}.do-icon-client:before{content:"\e6be"}.do-icon-maximize:before{content:"\e6bf"}.do-icon-star-full:before{content:"\e6c0"}.do-icon-camera:before{content:"\e6c1"}.do-icon-live:before{content:"\e6c2"}.do-icon-get:before{content:"\e6c3"}.do-icon-wrong:before{content:"\e6c4"} diff --git a/src/js/anot-touch.js b/src/js/anot-touch.js index 4258fe6..cab09ad 100644 --- a/src/js/anot-touch.js +++ b/src/js/anot-touch.js @@ -225,15 +225,15 @@ const _Anot = (function() { if ($elem === DOC.body) { scanTag($elem, []) } else { - var $parent = $elem - while (($parent = $parent.parentNode)) { - if ($parent.anotctrl) { + var _parent = $elem + while ((_parent = _parent.parentNode)) { + if (_parent.anotctrl) { break } } scanTag( $elem.parentNode, - $parent ? [VMODELS[$parent.anotctrl]] : [] + _parent ? [VMODELS[_parent.anotctrl]] : [] ) } } @@ -1456,6 +1456,7 @@ const _Anot = (function() { function $emit(key, args) { var event = this.$events + var _parent = null if (event && event[key]) { if (args) { args[2] = key @@ -1469,22 +1470,22 @@ const _Anot = (function() { } catch (e) {} } } - var parent = this.$up - if (parent) { + _parent = this.$up + if (_parent) { if (this.$pathname) { - $emit.call(parent, this.$pathname + '.' + key, args) //以确切的值往上冒泡 + $emit.call(_parent, this.$pathname + '.' + key, args) //以确切的值往上冒泡 } - $emit.call(parent, '*.' + key, args) //以模糊的值往上冒泡 + $emit.call(_parent, '*.' + key, args) //以模糊的值往上冒泡 } } else { - parent = this.$up + _parent = this.$up if (this.$ups) { for (var i in this.$ups) { $emit.call(this.$ups[i], i + '.' + key, args) //以确切的值往上冒泡 } return } - if (parent) { + if (_parent) { var p = this.$pathname if (p === '') p = '*' var path = p + '.' + key @@ -1493,11 +1494,11 @@ const _Anot = (function() { args = (args && args.concat([path, key])) || [path, key] if (arr.indexOf('*') === -1) { - $emit.call(parent, path, args) //以确切的值往上冒泡 + $emit.call(_parent, path, args) //以确切的值往上冒泡 arr[1] = '*' - $emit.call(parent, arr.join('.'), args) //以模糊的值往上冒泡 + $emit.call(_parent, arr.join('.'), args) //以模糊的值往上冒泡 } else { - $emit.call(parent, path, args) //以确切的值往上冒泡 + $emit.call(_parent, path, args) //以确切的值往上冒泡 } } } @@ -1743,6 +1744,12 @@ const _Anot = (function() { var v = $vmodel.$children[i] v.$fire && v.$fire.apply(v, [ee, a]) } + // component! 这是一个特殊的标识,可以直接修改子组件的state值 + } else if (path.indexOf('component!') === 0) { + var ee = path.slice(10) + for (var i in $vmodel.$children) { + $vmodel.$children[i][ee] = a + } } else { $emit.call($vmodel, path, [a]) } @@ -2758,9 +2765,9 @@ const _Anot = (function() { } array.push(obj) } - var parent = node.parentNode - if (parent && parent.nodeType === 1) { - showHidden(parent, array) + var _parent = node.parentNode + if (_parent && _parent.nodeType === 1) { + showHidden(_parent, array) } } } @@ -3339,12 +3346,16 @@ const _Anot = (function() { var rnoCollect = /^(:\S+|data-\S+|on[a-z]+|id|style|class)$/ var ronattr = '__fn__' + var specifiedVars = [':disabled', ':loading'] function getOptionsFromTag(elem, vmodels) { - var attributes = elem.attributes + var attributes = aslice.call(elem.attributes, 0) var ret = {} for (var i = 0, attr; (attr = attributes[i++]); ) { var name = attr.name - if (attr.specified && !rnoCollect.test(name)) { + if ( + (attr.specified && !rnoCollect.test(name)) || + specifiedVars.includes(name) + ) { if (name.indexOf(ronattr) === 0) { name = attr.value.slice(6) ret[name] = elem[attr.value] @@ -3364,6 +3375,7 @@ const _Anot = (function() { } else { ret[camelizeName] = parseData(attr.value) } + elem.removeAttribute(name) } } } @@ -3739,8 +3751,9 @@ const _Anot = (function() { arr.forEach(function(elem) { var slot = elem.getAttribute('slot') if (slot) { + obj[slot] = obj[slot] || [] elem.removeAttribute('slot') - obj[slot] = elem.outerHTML + obj[slot].push(elem.outerHTML) } }) return obj @@ -3771,6 +3784,8 @@ const _Anot = (function() { //如果还没有解析完,就延迟一下 #1155 return } + var parentVm = host.vmodels[0] + var state = {} var props = getOptionsFromTag(elem, host.vmodels) var $id = props.uuid || generateID(widget) var __willpush__ = null @@ -3778,7 +3793,24 @@ const _Anot = (function() { if (props.hasOwnProperty('hostPush')) { elem.removeAttribute('host-push') __willpush__ = props.hostPush - props.hostPush = host.vmodels[0][__willpush__] + props.hostPush = parentVm[__willpush__] + } + + if (props.hasOwnProperty(':disabled')) { + var disabledKey = props[':disabled'] + state.disabled = parentVm[disabledKey] + parentVm.$watch(disabledKey, function(val) { + parentVm.$fire('component!disabled', val) + }) + delete props[':disabled'] + } + if (props.hasOwnProperty(':loading')) { + var loadingKey = props[':loading'] + state.loading = parentVm[loadingKey] + parentVm.$watch(loadingKey, function(val) { + parentVm.$fire('component!loading', val) + }) + delete props[':loading'] } delete props.uuid @@ -3788,6 +3820,7 @@ const _Anot = (function() { hooks.state = hooks.state || {} Object.assign(hooks.props, props) + Object.assign(hooks.state, state) hooks.construct.call(elem, hooks.props, hooks.state) @@ -3810,13 +3843,13 @@ const _Anot = (function() { var vmodel = Anot(hooks) delete vmodel.$mounted - host.vmodels[0].$children.push(vmodel) + parentVm.$children.push(vmodel) elem.msResolved = 1 //防止二进扫描此元素 if (__willpush__) { hideProperty(vmodel, '$push', function(val) { - host.vmodels[0][__willpush__] = val + parentVm[__willpush__] = val }) } @@ -3988,12 +4021,12 @@ const _Anot = (function() { effectBinding(elem, binding) binding.includeRendered = getBindingCallback( elem, - 'data-include-rendered', + 'data-rendered', binding.vmodels ) binding.includeLoaded = getBindingCallback( elem, - 'data-include-loaded', + 'data-loaded', binding.vmodels ) var outer = (binding.includeReplace = !!Anot(elem).data( @@ -4057,10 +4090,10 @@ const _Anot = (function() { //chrome v37- 下embed标签动态设置的src,无法发起请求 if (window.chrome && elem.tagName === 'EMBED') { - var parent = elem.parentNode + var _parent = elem.parentNode var com = DOC.createComment(':src') - parent.replaceChild(com, elem) - parent.replaceChild(elem, com) + _parent.replaceChild(com, elem) + _parent.replaceChild(elem, com) } } else { var k = i @@ -4375,7 +4408,7 @@ const _Anot = (function() { var elem = binding.element var vmodels = binding.vmodels binding.changed = - getBindingCallback(elem, 'data-duplex-changed', vmodels) || noop + getBindingCallback(elem, 'data-changed', vmodels) || noop var params = [] var casting = oneObject('string,number,boolean,checked') if (elem.type === 'radio' && binding.param === '') { @@ -4995,12 +5028,12 @@ const _Anot = (function() { Anot.mix(Anot.effect, { apply: applyEffect, - append: function(el, parent, after, opts) { + append: function(el, _parent, after, opts) { return applyEffect( el, 1, function() { - parent.appendChild(el) + _parent.appendChild(el) }, after, opts @@ -5017,12 +5050,12 @@ const _Anot = (function() { opts ) }, - remove: function(el, parent, after, opts) { + remove: function(el, _parent, after, opts) { return applyEffect( el, 0, function() { - if (el.parentNode === parent) parent.removeChild(el) + if (el.parentNode === _parent) _parent.removeChild(el) }, after, opts @@ -5035,15 +5068,15 @@ const _Anot = (function() { var binding = this var elem = this.element var isHtmlFilter = elem.nodeType !== 1 - var parent = isHtmlFilter ? elem.parentNode : elem - if (!parent) return + var _parent = isHtmlFilter ? elem.parentNode : elem + if (!_parent) return val = val == null ? '' : val if (elem.nodeType === 3) { var signature = generateID('html') - parent.insertBefore(DOC.createComment(signature), elem) + _parent.insertBefore(DOC.createComment(signature), elem) binding.element = DOC.createComment(signature + ':end') - parent.replaceChild(binding.element, elem) + _parent.replaceChild(binding.element, elem) elem = binding.element } if (typeof val !== 'object') { @@ -5069,10 +5102,10 @@ const _Anot = (function() { if (!node || (node.nodeType === 8 && node.nodeValue === endValue)) { break } else { - parent.removeChild(node) + _parent.removeChild(node) } } - parent.insertBefore(fragment, elem) + _parent.insertBefore(fragment, elem) } else { Anot.clearHTML(elem).appendChild(fragment) } @@ -5430,14 +5463,9 @@ const _Anot = (function() { elem.removeAttribute(binding.name) effectBinding(elem, binding) binding.param = binding.param || 'el' - binding.sortedCallback = getBindingCallback( - elem, - 'data-repeat-sortby', - binding.vmodels - ) var rendered = getBindingCallback( elem, - 'data-repeat-rendered', + 'data-rendered', binding.vmodels ) @@ -5448,18 +5476,18 @@ const _Anot = (function() { binding.start = start binding.template = anotFragment.cloneNode(false) - var parent = elem.parentNode - parent.replaceChild(end, elem) - parent.insertBefore(start, end) + var _parent = elem.parentNode + _parent.replaceChild(end, elem) + _parent.insertBefore(start, end) binding.template.appendChild(elem) binding.element = end if (rendered) { - var removeFn = Anot.bind(parent, 'datasetchanged', function() { - rendered.apply(parent, parent.args) - Anot.unbind(parent, 'datasetchanged', removeFn) - parent.msRendered = rendered + var removeFn = Anot.bind(_parent, 'datasetchanged', function() { + rendered.apply(_parent, _parent.args) + Anot.unbind(_parent, 'datasetchanged', removeFn) + _parent.msRendered = rendered }) } } @@ -5486,14 +5514,6 @@ const _Anot = (function() { } } var track = this.track - if (binding.sortedCallback) { - //如果有回调,则让它们排序 - var keys2 = binding.sortedCallback.call(parent, track) - if (keys2 && Array.isArray(keys2)) { - track = keys2 - } - } - var action = 'move' binding.$repeat = value var fragments = [] @@ -5504,7 +5524,7 @@ const _Anot = (function() { var elem = this.element var length = track.length - var parent = elem.parentNode + var _parent = elem.parentNode //检查新元素数量 var newCount = 0 @@ -5523,7 +5543,7 @@ const _Anot = (function() { if (clear) { while (kill !== start) { - parent.removeChild(kill) + _parent.removeChild(kill) kill = elem.previousSibling } } @@ -5585,7 +5605,7 @@ const _Anot = (function() { } this.proxies = proxies if (init && !binding.effectDriver) { - parent.insertBefore(transation, elem) + _parent.insertBefore(transation, elem) fragments.forEach(function(fragment) { scanNodeArray(fragment.nodes || [], fragment.vmodels) //if(fragment.vmodels.length > 2) @@ -5617,7 +5637,7 @@ const _Anot = (function() { staggerIndex = mayStaggerAnimate( binding.effectEnterStagger, function() { - parent.insertBefore( + _parent.insertBefore( fragment.content, preElement.nextSibling ) @@ -5637,7 +5657,7 @@ const _Anot = (function() { function() { var curNode = removeItem(proxy2.$anchor) var inserted = Anot.slice(curNode.childNodes) - parent.insertBefore(curNode, preElement.nextSibling) + _parent.insertBefore(curNode, preElement.nextSibling) animateRepeat(inserted, 1, binding) }, staggerIndex @@ -5655,17 +5675,17 @@ const _Anot = (function() { //repeat --> duplex ;(function(args) { - parent.args = args - if (parent.msRendered) { + _parent.args = args + if (_parent.msRendered) { //第一次事件触发,以后直接调用 - parent.msRendered.apply(parent, args) + _parent.msRendered.apply(_parent, args) } })(kernel.newWatch ? arguments : [action]) var id = setTimeout(function() { clearTimeout(id) //触发上层的select回调及自己的rendered回调 - Anot.fireDom(parent, 'datasetchanged', { - bubble: parent.msHasEvent + Anot.fireDom(_parent, 'datasetchanged', { + bubble: _parent.msHasEvent }) }) this.enterCount -= 1 diff --git a/src/js/anot-touch.shim.js b/src/js/anot-touch.shim.js index c8ff95c..074d11e 100644 --- a/src/js/anot-touch.shim.js +++ b/src/js/anot-touch.shim.js @@ -240,15 +240,15 @@ if ($elem === DOC.body) { scanTag($elem, []) } else { - var $parent = $elem - while (($parent = $parent.parentNode)) { - if ($parent.anotctrl) { + var _parent = $elem + while ((_parent = _parent.parentNode)) { + if (_parent.anotctrl) { break } } scanTag( $elem.parentNode, - $parent ? [VMODELS[$parent.anotctrl]] : [] + _parent ? [VMODELS[_parent.anotctrl]] : [] ) } } @@ -1471,6 +1471,7 @@ function $emit(key, args) { var event = this.$events + var _parent = null if (event && event[key]) { if (args) { args[2] = key @@ -1484,22 +1485,22 @@ } catch (e) {} } } - var parent = this.$up - if (parent) { + _parent = this.$up + if (_parent) { if (this.$pathname) { - $emit.call(parent, this.$pathname + '.' + key, args) //以确切的值往上冒泡 + $emit.call(_parent, this.$pathname + '.' + key, args) //以确切的值往上冒泡 } - $emit.call(parent, '*.' + key, args) //以模糊的值往上冒泡 + $emit.call(_parent, '*.' + key, args) //以模糊的值往上冒泡 } } else { - parent = this.$up + _parent = this.$up if (this.$ups) { for (var i in this.$ups) { $emit.call(this.$ups[i], i + '.' + key, args) //以确切的值往上冒泡 } return } - if (parent) { + if (_parent) { var p = this.$pathname if (p === '') p = '*' var path = p + '.' + key @@ -1508,11 +1509,11 @@ args = (args && args.concat([path, key])) || [path, key] if (arr.indexOf('*') === -1) { - $emit.call(parent, path, args) //以确切的值往上冒泡 + $emit.call(_parent, path, args) //以确切的值往上冒泡 arr[1] = '*' - $emit.call(parent, arr.join('.'), args) //以模糊的值往上冒泡 + $emit.call(_parent, arr.join('.'), args) //以模糊的值往上冒泡 } else { - $emit.call(parent, path, args) //以确切的值往上冒泡 + $emit.call(_parent, path, args) //以确切的值往上冒泡 } } } @@ -1758,6 +1759,12 @@ var v = $vmodel.$children[i] v.$fire && v.$fire.apply(v, [ee, a]) } + // component! 这是一个特殊的标识,可以直接修改子组件的state值 + } else if (path.indexOf('component!') === 0) { + var ee = path.slice(10) + for (var i in $vmodel.$children) { + $vmodel.$children[i][ee] = a + } } else { $emit.call($vmodel, path, [a]) } @@ -2773,9 +2780,9 @@ } array.push(obj) } - var parent = node.parentNode - if (parent && parent.nodeType === 1) { - showHidden(parent, array) + var _parent = node.parentNode + if (_parent && _parent.nodeType === 1) { + showHidden(_parent, array) } } } @@ -3354,12 +3361,16 @@ var rnoCollect = /^(:\S+|data-\S+|on[a-z]+|id|style|class)$/ var ronattr = '__fn__' + var specifiedVars = [':disabled', ':loading'] function getOptionsFromTag(elem, vmodels) { - var attributes = elem.attributes + var attributes = aslice.call(elem.attributes, 0) var ret = {} for (var i = 0, attr; (attr = attributes[i++]); ) { var name = attr.name - if (attr.specified && !rnoCollect.test(name)) { + if ( + (attr.specified && !rnoCollect.test(name)) || + specifiedVars.includes(name) + ) { if (name.indexOf(ronattr) === 0) { name = attr.value.slice(6) ret[name] = elem[attr.value] @@ -3379,6 +3390,7 @@ } else { ret[camelizeName] = parseData(attr.value) } + elem.removeAttribute(name) } } } @@ -3754,8 +3766,9 @@ arr.forEach(function(elem) { var slot = elem.getAttribute('slot') if (slot) { + obj[slot] = obj[slot] || [] elem.removeAttribute('slot') - obj[slot] = elem.outerHTML + obj[slot].push(elem.outerHTML) } }) return obj @@ -3786,6 +3799,8 @@ //如果还没有解析完,就延迟一下 #1155 return } + var parentVm = host.vmodels[0] + var state = {} var props = getOptionsFromTag(elem, host.vmodels) var $id = props.uuid || generateID(widget) var __willpush__ = null @@ -3793,7 +3808,24 @@ if (props.hasOwnProperty('hostPush')) { elem.removeAttribute('host-push') __willpush__ = props.hostPush - props.hostPush = host.vmodels[0][__willpush__] + props.hostPush = parentVm[__willpush__] + } + + if (props.hasOwnProperty(':disabled')) { + var disabledKey = props[':disabled'] + state.disabled = parentVm[disabledKey] + parentVm.$watch(disabledKey, function(val) { + parentVm.$fire('component!disabled', val) + }) + delete props[':disabled'] + } + if (props.hasOwnProperty(':loading')) { + var loadingKey = props[':loading'] + state.loading = parentVm[loadingKey] + parentVm.$watch(loadingKey, function(val) { + parentVm.$fire('component!loading', val) + }) + delete props[':loading'] } delete props.uuid @@ -3803,6 +3835,7 @@ hooks.state = hooks.state || {} Object.assign(hooks.props, props) + Object.assign(hooks.state, state) hooks.construct.call(elem, hooks.props, hooks.state) @@ -3825,13 +3858,13 @@ var vmodel = Anot(hooks) delete vmodel.$mounted - host.vmodels[0].$children.push(vmodel) + parentVm.$children.push(vmodel) elem.msResolved = 1 //防止二进扫描此元素 if (__willpush__) { hideProperty(vmodel, '$push', function(val) { - host.vmodels[0][__willpush__] = val + parentVm[__willpush__] = val }) } @@ -4003,12 +4036,12 @@ effectBinding(elem, binding) binding.includeRendered = getBindingCallback( elem, - 'data-include-rendered', + 'data-rendered', binding.vmodels ) binding.includeLoaded = getBindingCallback( elem, - 'data-include-loaded', + 'data-loaded', binding.vmodels ) var outer = (binding.includeReplace = !!Anot(elem).data( @@ -4072,10 +4105,10 @@ //chrome v37- 下embed标签动态设置的src,无法发起请求 if (window.chrome && elem.tagName === 'EMBED') { - var parent = elem.parentNode + var _parent = elem.parentNode var com = DOC.createComment(':src') - parent.replaceChild(com, elem) - parent.replaceChild(elem, com) + _parent.replaceChild(com, elem) + _parent.replaceChild(elem, com) } } else { var k = i @@ -4390,7 +4423,7 @@ var elem = binding.element var vmodels = binding.vmodels binding.changed = - getBindingCallback(elem, 'data-duplex-changed', vmodels) || noop + getBindingCallback(elem, 'data-changed', vmodels) || noop var params = [] var casting = oneObject('string,number,boolean,checked') if (elem.type === 'radio' && binding.param === '') { @@ -5010,12 +5043,12 @@ Anot.mix(Anot.effect, { apply: applyEffect, - append: function(el, parent, after, opts) { + append: function(el, _parent, after, opts) { return applyEffect( el, 1, function() { - parent.appendChild(el) + _parent.appendChild(el) }, after, opts @@ -5032,12 +5065,12 @@ opts ) }, - remove: function(el, parent, after, opts) { + remove: function(el, _parent, after, opts) { return applyEffect( el, 0, function() { - if (el.parentNode === parent) parent.removeChild(el) + if (el.parentNode === _parent) _parent.removeChild(el) }, after, opts @@ -5050,15 +5083,15 @@ var binding = this var elem = this.element var isHtmlFilter = elem.nodeType !== 1 - var parent = isHtmlFilter ? elem.parentNode : elem - if (!parent) return + var _parent = isHtmlFilter ? elem.parentNode : elem + if (!_parent) return val = val == null ? '' : val if (elem.nodeType === 3) { var signature = generateID('html') - parent.insertBefore(DOC.createComment(signature), elem) + _parent.insertBefore(DOC.createComment(signature), elem) binding.element = DOC.createComment(signature + ':end') - parent.replaceChild(binding.element, elem) + _parent.replaceChild(binding.element, elem) elem = binding.element } if (typeof val !== 'object') { @@ -5084,10 +5117,10 @@ if (!node || (node.nodeType === 8 && node.nodeValue === endValue)) { break } else { - parent.removeChild(node) + _parent.removeChild(node) } } - parent.insertBefore(fragment, elem) + _parent.insertBefore(fragment, elem) } else { Anot.clearHTML(elem).appendChild(fragment) } @@ -5445,14 +5478,9 @@ elem.removeAttribute(binding.name) effectBinding(elem, binding) binding.param = binding.param || 'el' - binding.sortedCallback = getBindingCallback( - elem, - 'data-repeat-sortby', - binding.vmodels - ) var rendered = getBindingCallback( elem, - 'data-repeat-rendered', + 'data-rendered', binding.vmodels ) @@ -5463,18 +5491,18 @@ binding.start = start binding.template = anotFragment.cloneNode(false) - var parent = elem.parentNode - parent.replaceChild(end, elem) - parent.insertBefore(start, end) + var _parent = elem.parentNode + _parent.replaceChild(end, elem) + _parent.insertBefore(start, end) binding.template.appendChild(elem) binding.element = end if (rendered) { - var removeFn = Anot.bind(parent, 'datasetchanged', function() { - rendered.apply(parent, parent.args) - Anot.unbind(parent, 'datasetchanged', removeFn) - parent.msRendered = rendered + var removeFn = Anot.bind(_parent, 'datasetchanged', function() { + rendered.apply(_parent, _parent.args) + Anot.unbind(_parent, 'datasetchanged', removeFn) + _parent.msRendered = rendered }) } } @@ -5501,14 +5529,6 @@ } } var track = this.track - if (binding.sortedCallback) { - //如果有回调,则让它们排序 - var keys2 = binding.sortedCallback.call(parent, track) - if (keys2 && Array.isArray(keys2)) { - track = keys2 - } - } - var action = 'move' binding.$repeat = value var fragments = [] @@ -5519,7 +5539,7 @@ var elem = this.element var length = track.length - var parent = elem.parentNode + var _parent = elem.parentNode //检查新元素数量 var newCount = 0 @@ -5538,7 +5558,7 @@ if (clear) { while (kill !== start) { - parent.removeChild(kill) + _parent.removeChild(kill) kill = elem.previousSibling } } @@ -5600,7 +5620,7 @@ } this.proxies = proxies if (init && !binding.effectDriver) { - parent.insertBefore(transation, elem) + _parent.insertBefore(transation, elem) fragments.forEach(function(fragment) { scanNodeArray(fragment.nodes || [], fragment.vmodels) //if(fragment.vmodels.length > 2) @@ -5632,7 +5652,7 @@ staggerIndex = mayStaggerAnimate( binding.effectEnterStagger, function() { - parent.insertBefore( + _parent.insertBefore( fragment.content, preElement.nextSibling ) @@ -5652,7 +5672,7 @@ function() { var curNode = removeItem(proxy2.$anchor) var inserted = Anot.slice(curNode.childNodes) - parent.insertBefore(curNode, preElement.nextSibling) + _parent.insertBefore(curNode, preElement.nextSibling) animateRepeat(inserted, 1, binding) }, staggerIndex @@ -5670,17 +5690,17 @@ //repeat --> duplex ;(function(args) { - parent.args = args - if (parent.msRendered) { + _parent.args = args + if (_parent.msRendered) { //第一次事件触发,以后直接调用 - parent.msRendered.apply(parent, args) + _parent.msRendered.apply(_parent, args) } })(kernel.newWatch ? arguments : [action]) var id = setTimeout(function() { clearTimeout(id) //触发上层的select回调及自己的rendered回调 - Anot.fireDom(parent, 'datasetchanged', { - bubble: parent.msHasEvent + Anot.fireDom(_parent, 'datasetchanged', { + bubble: _parent.msHasEvent }) }) this.enterCount -= 1 diff --git a/src/js/anot.js b/src/js/anot.js index 8466b3c..aaec705 100644 --- a/src/js/anot.js +++ b/src/js/anot.js @@ -225,15 +225,15 @@ const _Anot = (function() { if ($elem === DOC.body) { scanTag($elem, []) } else { - var $parent = $elem - while (($parent = $parent.parentNode)) { - if ($parent.anotctrl) { + var _parent = $elem + while ((_parent = _parent.parentNode)) { + if (_parent.anotctrl) { break } } scanTag( $elem.parentNode, - $parent ? [VMODELS[$parent.anotctrl]] : [] + _parent ? [VMODELS[_parent.anotctrl]] : [] ) } } @@ -1456,6 +1456,7 @@ const _Anot = (function() { function $emit(key, args) { var event = this.$events + var _parent = null if (event && event[key]) { if (args) { args[2] = key @@ -1469,22 +1470,22 @@ const _Anot = (function() { } catch (e) {} } } - var parent = this.$up - if (parent) { + _parent = this.$up + if (_parent) { if (this.$pathname) { - $emit.call(parent, this.$pathname + '.' + key, args) //以确切的值往上冒泡 + $emit.call(_parent, this.$pathname + '.' + key, args) //以确切的值往上冒泡 } - $emit.call(parent, '*.' + key, args) //以模糊的值往上冒泡 + $emit.call(_parent, '*.' + key, args) //以模糊的值往上冒泡 } } else { - parent = this.$up + _parent = this.$up if (this.$ups) { for (var i in this.$ups) { $emit.call(this.$ups[i], i + '.' + key, args) //以确切的值往上冒泡 } return } - if (parent) { + if (_parent) { var p = this.$pathname if (p === '') p = '*' var path = p + '.' + key @@ -1493,11 +1494,11 @@ const _Anot = (function() { args = (args && args.concat([path, key])) || [path, key] if (arr.indexOf('*') === -1) { - $emit.call(parent, path, args) //以确切的值往上冒泡 + $emit.call(_parent, path, args) //以确切的值往上冒泡 arr[1] = '*' - $emit.call(parent, arr.join('.'), args) //以模糊的值往上冒泡 + $emit.call(_parent, arr.join('.'), args) //以模糊的值往上冒泡 } else { - $emit.call(parent, path, args) //以确切的值往上冒泡 + $emit.call(_parent, path, args) //以确切的值往上冒泡 } } } @@ -1743,6 +1744,12 @@ const _Anot = (function() { var v = $vmodel.$children[i] v.$fire && v.$fire.apply(v, [ee, a]) } + // component! 这是一个特殊的标识,可以直接修改子组件的state值 + } else if (path.indexOf('component!') === 0) { + var ee = path.slice(10) + for (var i in $vmodel.$children) { + $vmodel.$children[i][ee] = a + } } else { $emit.call($vmodel, path, [a]) } @@ -2758,9 +2765,9 @@ const _Anot = (function() { } array.push(obj) } - var parent = node.parentNode - if (parent && parent.nodeType === 1) { - showHidden(parent, array) + var _parent = node.parentNode + if (_parent && _parent.nodeType === 1) { + showHidden(_parent, array) } } } @@ -3339,12 +3346,16 @@ const _Anot = (function() { var rnoCollect = /^(:\S+|data-\S+|on[a-z]+|id|style|class)$/ var ronattr = '__fn__' + var specifiedVars = [':disabled', ':loading'] function getOptionsFromTag(elem, vmodels) { - var attributes = elem.attributes + var attributes = aslice.call(elem.attributes, 0) var ret = {} for (var i = 0, attr; (attr = attributes[i++]); ) { var name = attr.name - if (attr.specified && !rnoCollect.test(name)) { + if ( + (attr.specified && !rnoCollect.test(name)) || + specifiedVars.includes(name) + ) { if (name.indexOf(ronattr) === 0) { name = attr.value.slice(6) ret[name] = elem[attr.value] @@ -3364,6 +3375,7 @@ const _Anot = (function() { } else { ret[camelizeName] = parseData(attr.value) } + elem.removeAttribute(name) } } } @@ -3739,8 +3751,9 @@ const _Anot = (function() { arr.forEach(function(elem) { var slot = elem.getAttribute('slot') if (slot) { + obj[slot] = obj[slot] || [] elem.removeAttribute('slot') - obj[slot] = elem.outerHTML + obj[slot].push(elem.outerHTML) } }) return obj @@ -3771,6 +3784,8 @@ const _Anot = (function() { //如果还没有解析完,就延迟一下 #1155 return } + var parentVm = host.vmodels[0] + var state = {} var props = getOptionsFromTag(elem, host.vmodels) var $id = props.uuid || generateID(widget) var __willpush__ = null @@ -3778,7 +3793,24 @@ const _Anot = (function() { if (props.hasOwnProperty('hostPush')) { elem.removeAttribute('host-push') __willpush__ = props.hostPush - props.hostPush = host.vmodels[0][__willpush__] + props.hostPush = parentVm[__willpush__] + } + + if (props.hasOwnProperty(':disabled')) { + var disabledKey = props[':disabled'] + state.disabled = parentVm[disabledKey] + parentVm.$watch(disabledKey, function(val) { + parentVm.$fire('component!disabled', val) + }) + delete props[':disabled'] + } + if (props.hasOwnProperty(':loading')) { + var loadingKey = props[':loading'] + state.loading = parentVm[loadingKey] + parentVm.$watch(loadingKey, function(val) { + parentVm.$fire('component!loading', val) + }) + delete props[':loading'] } delete props.uuid @@ -3788,6 +3820,7 @@ const _Anot = (function() { hooks.state = hooks.state || {} Object.assign(hooks.props, props) + Object.assign(hooks.state, state) hooks.construct.call(elem, hooks.props, hooks.state) @@ -3810,13 +3843,13 @@ const _Anot = (function() { var vmodel = Anot(hooks) delete vmodel.$mounted - host.vmodels[0].$children.push(vmodel) + parentVm.$children.push(vmodel) elem.msResolved = 1 //防止二进扫描此元素 if (__willpush__) { hideProperty(vmodel, '$push', function(val) { - host.vmodels[0][__willpush__] = val + parentVm[__willpush__] = val }) } @@ -3988,12 +4021,12 @@ const _Anot = (function() { effectBinding(elem, binding) binding.includeRendered = getBindingCallback( elem, - 'data-include-rendered', + 'data-rendered', binding.vmodels ) binding.includeLoaded = getBindingCallback( elem, - 'data-include-loaded', + 'data-loaded', binding.vmodels ) var outer = (binding.includeReplace = !!Anot(elem).data( @@ -4057,10 +4090,10 @@ const _Anot = (function() { //chrome v37- 下embed标签动态设置的src,无法发起请求 if (window.chrome && elem.tagName === 'EMBED') { - var parent = elem.parentNode + var _parent = elem.parentNode var com = DOC.createComment(':src') - parent.replaceChild(com, elem) - parent.replaceChild(elem, com) + _parent.replaceChild(com, elem) + _parent.replaceChild(elem, com) } } else { var k = i @@ -4375,7 +4408,7 @@ const _Anot = (function() { var elem = binding.element var vmodels = binding.vmodels binding.changed = - getBindingCallback(elem, 'data-duplex-changed', vmodels) || noop + getBindingCallback(elem, 'data-changed', vmodels) || noop var params = [] var casting = oneObject('string,number,boolean,checked') if (elem.type === 'radio' && binding.param === '') { @@ -4995,12 +5028,12 @@ const _Anot = (function() { Anot.mix(Anot.effect, { apply: applyEffect, - append: function(el, parent, after, opts) { + append: function(el, _parent, after, opts) { return applyEffect( el, 1, function() { - parent.appendChild(el) + _parent.appendChild(el) }, after, opts @@ -5017,12 +5050,12 @@ const _Anot = (function() { opts ) }, - remove: function(el, parent, after, opts) { + remove: function(el, _parent, after, opts) { return applyEffect( el, 0, function() { - if (el.parentNode === parent) parent.removeChild(el) + if (el.parentNode === _parent) _parent.removeChild(el) }, after, opts @@ -5035,15 +5068,15 @@ const _Anot = (function() { var binding = this var elem = this.element var isHtmlFilter = elem.nodeType !== 1 - var parent = isHtmlFilter ? elem.parentNode : elem - if (!parent) return + var _parent = isHtmlFilter ? elem.parentNode : elem + if (!_parent) return val = val == null ? '' : val if (elem.nodeType === 3) { var signature = generateID('html') - parent.insertBefore(DOC.createComment(signature), elem) + _parent.insertBefore(DOC.createComment(signature), elem) binding.element = DOC.createComment(signature + ':end') - parent.replaceChild(binding.element, elem) + _parent.replaceChild(binding.element, elem) elem = binding.element } if (typeof val !== 'object') { @@ -5069,10 +5102,10 @@ const _Anot = (function() { if (!node || (node.nodeType === 8 && node.nodeValue === endValue)) { break } else { - parent.removeChild(node) + _parent.removeChild(node) } } - parent.insertBefore(fragment, elem) + _parent.insertBefore(fragment, elem) } else { Anot.clearHTML(elem).appendChild(fragment) } @@ -5430,14 +5463,9 @@ const _Anot = (function() { elem.removeAttribute(binding.name) effectBinding(elem, binding) binding.param = binding.param || 'el' - binding.sortedCallback = getBindingCallback( - elem, - 'data-repeat-sortby', - binding.vmodels - ) var rendered = getBindingCallback( elem, - 'data-repeat-rendered', + 'data-rendered', binding.vmodels ) @@ -5448,18 +5476,18 @@ const _Anot = (function() { binding.start = start binding.template = anotFragment.cloneNode(false) - var parent = elem.parentNode - parent.replaceChild(end, elem) - parent.insertBefore(start, end) + var _parent = elem.parentNode + _parent.replaceChild(end, elem) + _parent.insertBefore(start, end) binding.template.appendChild(elem) binding.element = end if (rendered) { - var removeFn = Anot.bind(parent, 'datasetchanged', function() { - rendered.apply(parent, parent.args) - Anot.unbind(parent, 'datasetchanged', removeFn) - parent.msRendered = rendered + var removeFn = Anot.bind(_parent, 'datasetchanged', function() { + rendered.apply(_parent, _parent.args) + Anot.unbind(_parent, 'datasetchanged', removeFn) + _parent.msRendered = rendered }) } } @@ -5486,14 +5514,6 @@ const _Anot = (function() { } } var track = this.track - if (binding.sortedCallback) { - //如果有回调,则让它们排序 - var keys2 = binding.sortedCallback.call(parent, track) - if (keys2 && Array.isArray(keys2)) { - track = keys2 - } - } - var action = 'move' binding.$repeat = value var fragments = [] @@ -5504,7 +5524,7 @@ const _Anot = (function() { var elem = this.element var length = track.length - var parent = elem.parentNode + var _parent = elem.parentNode //检查新元素数量 var newCount = 0 @@ -5523,7 +5543,7 @@ const _Anot = (function() { if (clear) { while (kill !== start) { - parent.removeChild(kill) + _parent.removeChild(kill) kill = elem.previousSibling } } @@ -5585,7 +5605,7 @@ const _Anot = (function() { } this.proxies = proxies if (init && !binding.effectDriver) { - parent.insertBefore(transation, elem) + _parent.insertBefore(transation, elem) fragments.forEach(function(fragment) { scanNodeArray(fragment.nodes || [], fragment.vmodels) //if(fragment.vmodels.length > 2) @@ -5617,7 +5637,7 @@ const _Anot = (function() { staggerIndex = mayStaggerAnimate( binding.effectEnterStagger, function() { - parent.insertBefore( + _parent.insertBefore( fragment.content, preElement.nextSibling ) @@ -5637,7 +5657,7 @@ const _Anot = (function() { function() { var curNode = removeItem(proxy2.$anchor) var inserted = Anot.slice(curNode.childNodes) - parent.insertBefore(curNode, preElement.nextSibling) + _parent.insertBefore(curNode, preElement.nextSibling) animateRepeat(inserted, 1, binding) }, staggerIndex @@ -5655,17 +5675,17 @@ const _Anot = (function() { //repeat --> duplex ;(function(args) { - parent.args = args - if (parent.msRendered) { + _parent.args = args + if (_parent.msRendered) { //第一次事件触发,以后直接调用 - parent.msRendered.apply(parent, args) + _parent.msRendered.apply(_parent, args) } })(kernel.newWatch ? arguments : [action]) var id = setTimeout(function() { clearTimeout(id) //触发上层的select回调及自己的rendered回调 - Anot.fireDom(parent, 'datasetchanged', { - bubble: parent.msHasEvent + Anot.fireDom(_parent, 'datasetchanged', { + bubble: _parent.msHasEvent }) }) this.enterCount -= 1 diff --git a/src/js/anot.shim.js b/src/js/anot.shim.js index 3a44037..37030ed 100644 --- a/src/js/anot.shim.js +++ b/src/js/anot.shim.js @@ -240,15 +240,15 @@ if ($elem === DOC.body) { scanTag($elem, []) } else { - var $parent = $elem - while (($parent = $parent.parentNode)) { - if ($parent.anotctrl) { + var _parent = $elem + while ((_parent = _parent.parentNode)) { + if (_parent.anotctrl) { break } } scanTag( $elem.parentNode, - $parent ? [VMODELS[$parent.anotctrl]] : [] + _parent ? [VMODELS[_parent.anotctrl]] : [] ) } } @@ -1471,6 +1471,7 @@ function $emit(key, args) { var event = this.$events + var _parent = null if (event && event[key]) { if (args) { args[2] = key @@ -1484,22 +1485,22 @@ } catch (e) {} } } - var parent = this.$up - if (parent) { + _parent = this.$up + if (_parent) { if (this.$pathname) { - $emit.call(parent, this.$pathname + '.' + key, args) //以确切的值往上冒泡 + $emit.call(_parent, this.$pathname + '.' + key, args) //以确切的值往上冒泡 } - $emit.call(parent, '*.' + key, args) //以模糊的值往上冒泡 + $emit.call(_parent, '*.' + key, args) //以模糊的值往上冒泡 } } else { - parent = this.$up + _parent = this.$up if (this.$ups) { for (var i in this.$ups) { $emit.call(this.$ups[i], i + '.' + key, args) //以确切的值往上冒泡 } return } - if (parent) { + if (_parent) { var p = this.$pathname if (p === '') p = '*' var path = p + '.' + key @@ -1508,11 +1509,11 @@ args = (args && args.concat([path, key])) || [path, key] if (arr.indexOf('*') === -1) { - $emit.call(parent, path, args) //以确切的值往上冒泡 + $emit.call(_parent, path, args) //以确切的值往上冒泡 arr[1] = '*' - $emit.call(parent, arr.join('.'), args) //以模糊的值往上冒泡 + $emit.call(_parent, arr.join('.'), args) //以模糊的值往上冒泡 } else { - $emit.call(parent, path, args) //以确切的值往上冒泡 + $emit.call(_parent, path, args) //以确切的值往上冒泡 } } } @@ -1758,6 +1759,12 @@ var v = $vmodel.$children[i] v.$fire && v.$fire.apply(v, [ee, a]) } + // component! 这是一个特殊的标识,可以直接修改子组件的state值 + } else if (path.indexOf('component!') === 0) { + var ee = path.slice(10) + for (var i in $vmodel.$children) { + $vmodel.$children[i][ee] = a + } } else { $emit.call($vmodel, path, [a]) } @@ -2773,9 +2780,9 @@ } array.push(obj) } - var parent = node.parentNode - if (parent && parent.nodeType === 1) { - showHidden(parent, array) + var _parent = node.parentNode + if (_parent && _parent.nodeType === 1) { + showHidden(_parent, array) } } } @@ -3354,12 +3361,16 @@ var rnoCollect = /^(:\S+|data-\S+|on[a-z]+|id|style|class)$/ var ronattr = '__fn__' + var specifiedVars = [':disabled', ':loading'] function getOptionsFromTag(elem, vmodels) { - var attributes = elem.attributes + var attributes = aslice.call(elem.attributes, 0) var ret = {} for (var i = 0, attr; (attr = attributes[i++]); ) { var name = attr.name - if (attr.specified && !rnoCollect.test(name)) { + if ( + (attr.specified && !rnoCollect.test(name)) || + specifiedVars.includes(name) + ) { if (name.indexOf(ronattr) === 0) { name = attr.value.slice(6) ret[name] = elem[attr.value] @@ -3379,6 +3390,7 @@ } else { ret[camelizeName] = parseData(attr.value) } + elem.removeAttribute(name) } } } @@ -3754,8 +3766,9 @@ arr.forEach(function(elem) { var slot = elem.getAttribute('slot') if (slot) { + obj[slot] = obj[slot] || [] elem.removeAttribute('slot') - obj[slot] = elem.outerHTML + obj[slot].push(elem.outerHTML) } }) return obj @@ -3786,6 +3799,8 @@ //如果还没有解析完,就延迟一下 #1155 return } + var parentVm = host.vmodels[0] + var state = {} var props = getOptionsFromTag(elem, host.vmodels) var $id = props.uuid || generateID(widget) var __willpush__ = null @@ -3793,7 +3808,24 @@ if (props.hasOwnProperty('hostPush')) { elem.removeAttribute('host-push') __willpush__ = props.hostPush - props.hostPush = host.vmodels[0][__willpush__] + props.hostPush = parentVm[__willpush__] + } + + if (props.hasOwnProperty(':disabled')) { + var disabledKey = props[':disabled'] + state.disabled = parentVm[disabledKey] + parentVm.$watch(disabledKey, function(val) { + parentVm.$fire('component!disabled', val) + }) + delete props[':disabled'] + } + if (props.hasOwnProperty(':loading')) { + var loadingKey = props[':loading'] + state.loading = parentVm[loadingKey] + parentVm.$watch(loadingKey, function(val) { + parentVm.$fire('component!loading', val) + }) + delete props[':loading'] } delete props.uuid @@ -3803,6 +3835,7 @@ hooks.state = hooks.state || {} Object.assign(hooks.props, props) + Object.assign(hooks.state, state) hooks.construct.call(elem, hooks.props, hooks.state) @@ -3825,13 +3858,13 @@ var vmodel = Anot(hooks) delete vmodel.$mounted - host.vmodels[0].$children.push(vmodel) + parentVm.$children.push(vmodel) elem.msResolved = 1 //防止二进扫描此元素 if (__willpush__) { hideProperty(vmodel, '$push', function(val) { - host.vmodels[0][__willpush__] = val + parentVm[__willpush__] = val }) } @@ -4003,12 +4036,12 @@ effectBinding(elem, binding) binding.includeRendered = getBindingCallback( elem, - 'data-include-rendered', + 'data-rendered', binding.vmodels ) binding.includeLoaded = getBindingCallback( elem, - 'data-include-loaded', + 'data-loaded', binding.vmodels ) var outer = (binding.includeReplace = !!Anot(elem).data( @@ -4072,10 +4105,10 @@ //chrome v37- 下embed标签动态设置的src,无法发起请求 if (window.chrome && elem.tagName === 'EMBED') { - var parent = elem.parentNode + var _parent = elem.parentNode var com = DOC.createComment(':src') - parent.replaceChild(com, elem) - parent.replaceChild(elem, com) + _parent.replaceChild(com, elem) + _parent.replaceChild(elem, com) } } else { var k = i @@ -4390,7 +4423,7 @@ var elem = binding.element var vmodels = binding.vmodels binding.changed = - getBindingCallback(elem, 'data-duplex-changed', vmodels) || noop + getBindingCallback(elem, 'data-changed', vmodels) || noop var params = [] var casting = oneObject('string,number,boolean,checked') if (elem.type === 'radio' && binding.param === '') { @@ -5010,12 +5043,12 @@ Anot.mix(Anot.effect, { apply: applyEffect, - append: function(el, parent, after, opts) { + append: function(el, _parent, after, opts) { return applyEffect( el, 1, function() { - parent.appendChild(el) + _parent.appendChild(el) }, after, opts @@ -5032,12 +5065,12 @@ opts ) }, - remove: function(el, parent, after, opts) { + remove: function(el, _parent, after, opts) { return applyEffect( el, 0, function() { - if (el.parentNode === parent) parent.removeChild(el) + if (el.parentNode === _parent) _parent.removeChild(el) }, after, opts @@ -5050,15 +5083,15 @@ var binding = this var elem = this.element var isHtmlFilter = elem.nodeType !== 1 - var parent = isHtmlFilter ? elem.parentNode : elem - if (!parent) return + var _parent = isHtmlFilter ? elem.parentNode : elem + if (!_parent) return val = val == null ? '' : val if (elem.nodeType === 3) { var signature = generateID('html') - parent.insertBefore(DOC.createComment(signature), elem) + _parent.insertBefore(DOC.createComment(signature), elem) binding.element = DOC.createComment(signature + ':end') - parent.replaceChild(binding.element, elem) + _parent.replaceChild(binding.element, elem) elem = binding.element } if (typeof val !== 'object') { @@ -5084,10 +5117,10 @@ if (!node || (node.nodeType === 8 && node.nodeValue === endValue)) { break } else { - parent.removeChild(node) + _parent.removeChild(node) } } - parent.insertBefore(fragment, elem) + _parent.insertBefore(fragment, elem) } else { Anot.clearHTML(elem).appendChild(fragment) } @@ -5445,14 +5478,9 @@ elem.removeAttribute(binding.name) effectBinding(elem, binding) binding.param = binding.param || 'el' - binding.sortedCallback = getBindingCallback( - elem, - 'data-repeat-sortby', - binding.vmodels - ) var rendered = getBindingCallback( elem, - 'data-repeat-rendered', + 'data-rendered', binding.vmodels ) @@ -5463,18 +5491,18 @@ binding.start = start binding.template = anotFragment.cloneNode(false) - var parent = elem.parentNode - parent.replaceChild(end, elem) - parent.insertBefore(start, end) + var _parent = elem.parentNode + _parent.replaceChild(end, elem) + _parent.insertBefore(start, end) binding.template.appendChild(elem) binding.element = end if (rendered) { - var removeFn = Anot.bind(parent, 'datasetchanged', function() { - rendered.apply(parent, parent.args) - Anot.unbind(parent, 'datasetchanged', removeFn) - parent.msRendered = rendered + var removeFn = Anot.bind(_parent, 'datasetchanged', function() { + rendered.apply(_parent, _parent.args) + Anot.unbind(_parent, 'datasetchanged', removeFn) + _parent.msRendered = rendered }) } } @@ -5501,14 +5529,6 @@ } } var track = this.track - if (binding.sortedCallback) { - //如果有回调,则让它们排序 - var keys2 = binding.sortedCallback.call(parent, track) - if (keys2 && Array.isArray(keys2)) { - track = keys2 - } - } - var action = 'move' binding.$repeat = value var fragments = [] @@ -5519,7 +5539,7 @@ var elem = this.element var length = track.length - var parent = elem.parentNode + var _parent = elem.parentNode //检查新元素数量 var newCount = 0 @@ -5538,7 +5558,7 @@ if (clear) { while (kill !== start) { - parent.removeChild(kill) + _parent.removeChild(kill) kill = elem.previousSibling } } @@ -5600,7 +5620,7 @@ } this.proxies = proxies if (init && !binding.effectDriver) { - parent.insertBefore(transation, elem) + _parent.insertBefore(transation, elem) fragments.forEach(function(fragment) { scanNodeArray(fragment.nodes || [], fragment.vmodels) //if(fragment.vmodels.length > 2) @@ -5632,7 +5652,7 @@ staggerIndex = mayStaggerAnimate( binding.effectEnterStagger, function() { - parent.insertBefore( + _parent.insertBefore( fragment.content, preElement.nextSibling ) @@ -5652,7 +5672,7 @@ function() { var curNode = removeItem(proxy2.$anchor) var inserted = Anot.slice(curNode.childNodes) - parent.insertBefore(curNode, preElement.nextSibling) + _parent.insertBefore(curNode, preElement.nextSibling) animateRepeat(inserted, 1, binding) }, staggerIndex @@ -5670,17 +5690,17 @@ //repeat --> duplex ;(function(args) { - parent.args = args - if (parent.msRendered) { + _parent.args = args + if (_parent.msRendered) { //第一次事件触发,以后直接调用 - parent.msRendered.apply(parent, args) + _parent.msRendered.apply(_parent, args) } })(kernel.newWatch ? arguments : [action]) var id = setTimeout(function() { clearTimeout(id) //触发上层的select回调及自己的rendered回调 - Anot.fireDom(parent, 'datasetchanged', { - bubble: parent.msHasEvent + Anot.fireDom(_parent, 'datasetchanged', { + bubble: _parent.msHasEvent }) }) this.enterCount -= 1 diff --git a/src/js/form/index.js b/src/js/form/index.js new file mode 100644 index 0000000..1465262 --- /dev/null +++ b/src/js/form/index.js @@ -0,0 +1,50 @@ +/** + * 各种表单元素组件 + * @authors yutent (yutent@doui.cc) + * @date 2018-06-12 13:08:41 + * @version $Id$ + */ + +import './style.scss' +const log = console.log + +export default Anot.component('button', { + construct(props, state) { + log(props) + state.text = this.textContent + state.style = { 'border-radius': props.radius } + this.classList.add('do-fn-noselect') + this.classList.add('do-button') + this.setAttribute(':click', 'onClick') + }, + render() { + let icon = '' + if (this.props.icon) { + icon = `` + } + return `${icon}` + }, + state: { + state: '', + disabled: false, + foo: true, + style: {} + }, + props: { + click: Anot.PropsTypes.isFunction() + }, + skip: ['style'], + componentDidMount() { + Anot(this.$elem).css(this.style) + }, + watch: {}, + methods: { + onClick() { + // log(this) + if (this.disabled) { + return + } + log('hello world, button') + } + } +}) diff --git a/src/js/form/style.scss b/src/js/form/style.scss new file mode 100644 index 0000000..ab392d7 --- /dev/null +++ b/src/js/form/style.scss @@ -0,0 +1,22 @@ +@charset "UTF-8"; +/** + * + * @authors yutent (yutent@doui.cc) + * @date 2018-06-12 13:08:26 + * @version $Id$ + */ + +@import "var.scss"; + + +.do-button {overflow:hidden;position:relative;display:inline-block;width:auto;min-width:60px;height:30px;margin-left:5px;padding:0 10px;color:nth($ct, 1);text-align:center;cursor:pointer; + + &::before {position:absolute;left:-50%;top:-50%;display:block;width:200%;height:200%;border-radius:50%;background:nth($cp, 2); content:"";opacity:0;transform: scale(0, .0); transition:opacity 1.3s cubic-bezier(0.23, 1, 0.32, 1),transform 1.3s cubic-bezier(0.23, 1, 0.32, 1);} + + &:hover { + &::before {opacity:1;transform:scale(1, .8);} + } + &:active {background:nth($cp, 1)} + + &__text,&__icon {position:relative;display:inline-block;} +} \ No newline at end of file diff --git a/src/js/router/index.js b/src/js/router/index.js index dcdf350..af20c8f 100644 --- a/src/js/router/index.js +++ b/src/js/router/index.js @@ -7,7 +7,7 @@ 'use strict' //储存版本信息 -Anot.ui.router = '0.0.1' +Anot.ui.router = '1.0.0' //判定A标签的target属性是否指向自身 //thanks https://github.com/quirkey/sammy/blob/master/lib/sammy.js#L219 @@ -233,21 +233,13 @@ Anot.component('link', { delete props.to }, render() { - return '' + return '' }, state: { link: '' }, props: { - label: '', - click: Anot.PropsTypes.isFunction() - }, - methods: { - onClick() { - if (typeof this.props.click === 'function') { - this.props.click() - } - } + label: '' } })