all files / directives/ css.js

97.62% Statements 82/84
94.83% Branches 55/58
100% Functions 7/7
97.62% Lines 82/84
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    128× 128× 128× 18× 18× 33×   18× 18×       128× 128× 128× 71× 71×   57× 35× 35× 64× 28× 28×   36×     22× 26× 19×   26×       29× 41×       100× 92× 92×           13× 13× 13× 13× 17×             42× 42× 55× 42×     120× 119× 115× 114× 114×   111× 12× 99× 22×   77×     12×   10× 10×               22× 21× 19× 23× 22× 22×           11×  
import { avalon, platform } from '../seed/core'
var arrayWarn = {}
var cssDir = avalon.directive('css', {
    diff: function(newVal, oldVal) {
        Eif (Object(newVal) === newVal) {
            newVal = platform.toJson(newVal) //安全的遍历VBscript
            if (Array.isArray(newVal)) { //转换成对象
                var b = {}
                newVal.forEach(function(el) {
                    el && avalon.shadowCopy(b, el)
                })
                newVal = b
                if (!arrayWarn[this.type]) {
                    avalon.warn('ms-' + this.type + '指令的值不建议使用数组形式了!')
                    arrayWarn[this.type] = 1
                }
            }
 
            var hasChange = false
            var patch = {}
            if (!oldVal) { //如果一开始为空
                patch = newVal
                hasChange = true
            } else {
                if (this.deep) {
                    var deep = typeof this.deep === 'number' ? this.deep : 6
                    for (let i in newVal) { //diff差异点  
                        if (!deepEquals(newVal[i], oldVal[i], 4)) {
                            this.value = newVal
                            return true
                        }
                        patch[i] = newVal[i]
                    }
                } else {
                    for (let i in newVal) { //diff差异点
                        if (newVal[i] !== oldVal[i]) {
                            hasChange = true
                        }
                        patch[i] = newVal[i]
                    }
                }
 
                for (let i in oldVal) {
                    if (!(i in patch)) {
                        hasChange = true
                        patch[i] = ''
                    }
                }
            }
            if (hasChange) {
                this.value = patch
                return true
            }
        }
        return false
    },
    update: function(vdom, value) {
 
        var dom = vdom.dom
        Eif (dom && dom.nodeType === 1) {
            var wrap = avalon(dom)
            for (var name in value) {
                wrap.css(name, value[name])
            }
        }
    }
})
 
export var cssDiff = cssDir.diff
 
export function getEnumerableKeys(obj) {
    const res = [];
    for (let key in obj)
        res.push(key)
    return res
}
 
export function deepEquals(a, b, level) {
    if (level === 0)
        return a === b
    if (a === null && b === null)
        return true
    if (a === undefined && b === undefined)
        return true
    const aIsArray = Array.isArray(a)
    if (aIsArray !== Array.isArray(b)) {
        return false
    }
    if (aIsArray) {
        return equalArray(a, b, level)
    } else if (typeof a === "object" && typeof b === "object") {
        return equalObject(a, b, level)
    }
    return a === b
}
 
function equalArray(a, b, level) {
    if (a.length !== b.length) {
        return false
    }
    for (let i = a.length - 1; i >= 0; i--) {
        try {
            if (!deepEquals(a[i], b[i], level - 1)) {
                return false
            }
        } catch (noThisPropError) {
            return false
        }
    }
    return true
}
 
function equalObject(a, b, level) {
    if (a === null || b === null)
        return false;
    if (getEnumerableKeys(a).length !== getEnumerableKeys(b).length)
        return false;
    for (let prop in a) {
        if (!(prop in b))
            return false
        try {
            if (!deepEquals(a[prop], b[prop], level - 1)) {
                return false
            }
        } catch (noThisPropError) {
            return false
        }
    }
    return true
}