mmRouter
mmRouter copied to clipboard
mmState升级
//重写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()
}
}
/** @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)
}
}
// 事件管理器
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 = []
})
//从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
}
},
为什么单独列出来,怎么没有合并到库