function _update() {
        if (d.$destroyed) return consoler.warn('Directive "' + name + '" already destroyed.')

        var hasDiff = false
        // empty expression also can trigger update, such `r-text` directive
        if (!isExpr || isConst) {
            if (shouldUpdate && shouldUpdate.call(d)) {
                upda && upda.call(d)
            }
        } else {
            var nexv = d.$exec(expr, mutable || !customDiff) // [error, result]
            var r = nexv[1]
            var payload = {}
            if (!nexv[0]) {
                if (customDiff) {
                    hasDiff = customDiff.call(d, r, prev)
                } else {
                    r = util.cloneAndDiff(r, prev, payload)
                    hasDiff = !!payload.diff
                }
                if (hasDiff && (!shouldUpdate || shouldUpdate.call(d, r, prev))) {
                    var p = prev
                    prev = r
                    upda && upda.call(d, r, p)
                }
            }
        }
        afterUpdate && afterUpdate.call(d, hasDiff)
    }
function _update() {
        if (d.$destroyed) return consoler.warn('Directive "' + name + '" already destroyed.')

        var hasDiff = false
        
        if (!isExpr || isConst) {
            if (shouldUpdate && shouldUpdate.call(d)) {
                upda && upda.call(d)
            }
        } else {
            var nexv = d.$exec(expr, mutable || !customDiff) 
            var r = nexv[1]
            var payload = {}
            if (!nexv[0]) {
                if (customDiff) {
                    hasDiff = customDiff.call(d, r, prev)
                } else {
                    r = util.cloneAndDiff(r, prev, payload)
                    hasDiff = !!payload.diff
                }
                if (hasDiff && (!shouldUpdate || shouldUpdate.call(d, r, prev))) {
                    var p = prev
                    prev = r
                    upda && upda.call(d, r, p)
                }
            }
        }
        afterUpdate && afterUpdate.call(d, hasDiff)
    }
function _update ( ) { if ( d . $destroyed ) return consoler . warn ( 'Directive "' + name + '" already destroyed.' ) var hasDiff = false // empty expression also can trigger update, such `r-text` directive if ( ! isExpr || isConst ) { if ( shouldUpdate && shouldUpdate . call ( d ) ) { upda && upda . call ( d ) } } else { var nexv = d . $exec ( expr , mutable || ! customDiff ) // [error, result] var r = nexv [ 1 ] var payload = { } if ( ! nexv [ 0 ] ) { if ( customDiff ) { hasDiff = customDiff . call ( d , r , prev ) } else { r = util . cloneAndDiff ( r , prev , payload ) hasDiff = ! ! payload . diff } if ( hasDiff && ( ! shouldUpdate || shouldUpdate . call ( d , r , prev ) ) ) { var p = prev prev = r upda && upda . call ( d , r , p ) } } } afterUpdate && afterUpdate . call ( d , hasDiff ) }
update handler
update handler