all files / directives/ if.js

100% Statements 34/34
100% Branches 18/18
100% Functions 5/5
100% Lines 34/34
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          18× 18× 18× 18× 18×     38× 38× 36× 36×       36× 10× 10×   26× 26×   26×   17× 17× 17× 17× 17× 17× 17× 17× 10×         18× 10×         19× 19× 19×  
import { avalon, createAnchor } from '../seed/core'
 
avalon.directive('if', {
    delay: true,
    priority: 5,
    init: function() {
        this.placeholder = createAnchor('if')
        var props = this.node.props
        delete props['ms-if']
        delete props[':if']
        this.fragment = avalon.vdom(this.node, 'toHTML')
    },
    diff: function(newVal, oldVal) {
        var n = !!newVal
        if (oldVal === void 0 || n !== oldVal) {
            this.value = n
            return true
        }
    },
    update: function(vdom, value) {
        if (this.isShow === void 0 && value) {
            continueScan(this, vdom)
            return
        }
        this.isShow = value
        var placeholder = this.placeholder
 
        if (value) {
            var p = placeholder.parentNode
            continueScan(this, vdom)
            p && p.replaceChild(vdom.dom, placeholder)
        } else { //移除DOM
            this.beforeDispose()
            vdom.nodeValue = 'if'
            vdom.nodeName = '#comment'
            delete vdom.children
            var dom = vdom.dom
            var p = dom && dom.parentNode
            vdom.dom = placeholder
            if (p) {
                p.replaceChild(placeholder, dom)
            }
        }
    },
    beforeDispose: function(){
        if (this.innerRender) {
            this.innerRender.dispose()
        }
    }
})
 
function continueScan(instance, vdom) {
    var innerRender = instance.innerRender = avalon.scan(instance.fragment, instance.vm)
    avalon.shadowCopy(vdom, innerRender.root)
    delete vdom.nodeValue
}