RubyLouvre / mmRouter

avalon的三柱臣之一( 路由,动画,AJAX)
119 stars 78 forks source link

mmState升级 #101

Open RubyLouvre opened 8 years ago

RubyLouvre commented 8 years ago
//重写mmRouter中的route方法     
    avalon.router.route = function (method, path, query, options) {
        path = path.trim()
        var states = this.routingTable[method]
        //el为一个个状态对象,状态对象的callback总是返回一个Promise
        for (var i = 0, el; el = states[i++]; ) {
            var args = path.match(el.regexp)
            if (args && el.abstract !== true) {//不能是抽象状态
                var newParams = {
                    keys: el.keys,
                    params: el.params || {}
                }
                var params = newParams.params
                params.query =  query || {}
                args.shift()
                if (el.keys.length) {
                        this._parseArgs(args, newParams)
                 }
                if (el.stateName) { //这里mmState独有的
                    mmState.transitionTo(mmState.currentState, el,  params, options)
                } else {
                    el.callback.apply(el, args)
                }
                return
            }
        }
        if (this.errorback) {//如果没有匹配则报错
            this.errorback()
        }
    }
RubyLouvre commented 8 years ago
   /**  @interface avalon.router.go 跳转到一个已定义状态上,params对参数对象
     *  @param toName 状态name
     *  @param params 附加参数
     *  @param params.query 在hash后面附加的类似search的参数对
     *  @param options 扩展配置
     *  @param options.reload true强制reload,即便url、参数并未发生变化
     *  @param options.replace true替换history,否则生成一条新的历史记录
     *  @param options.confirmed true不触发onBeforeUnload,$onBeforeUnload,onBeforeExit
     */
    avalon.router.go = function (toName, params, options) {
        var from = mmState.currentState,
                to = StateModel.is(toName) ? toName : getStateByName(toName)
        if (to) {
            var toParams = avalon.mix(true, {}, to.params,  params || {})
            mmState.transitionTo(from, to, toParams, options)
        }
    }
RubyLouvre commented 8 years ago
   // 事件管理器
    var Event = window.$eventManager = avalon.define({
        $id: "$eventManager",
        $flag: 0,
        uiqKey: function () {
            return "flag" + (++Event.$flag)
        }
    })
    Event.$watch("onAbort", function(){
        var nodes = mmState.oldNodes
        for(var i = 0, node; node = nodes[i++];){
           node.parentNode && node.parentNode.removeChild(node)
        }
        mmState.oldNodes = []
    })
RubyLouvre commented 8 years ago
//从params中抽取hash
        urlFormate: function (url, params, query) {
            var query = query ? queryToString(query) : "",
                    hash = url.replace(placeholder, function (mat) {
                        var key = mat.replace(/[\{\}]/g, '').split(":")
                        key = key[0] ? key[0] : key[1]
                        return params[key] !== undefined ? params[key] : ''
                    }).replace(/^\//g, '')
            return {
                path: hash,
                query: query
            }
        },
susan51531 commented 8 years ago

为什么单独列出来,怎么没有合并到库