我想在"路径命名空间"时添加一个钩子函数。变化。例如,当路由器从 myapp / 字段 / 9837278993 转到 myapp / 列表 / 183727856 时。当然,我可以在主onBeforeAction
钩子中使用一些正则表达式条件逻辑。更抽象的逻辑将是#34;当命名空间从字段转到除字段之外的其他任何操作时。你有什么建议?谢谢你的帮助!
答案 0 :(得分:0)
我认为你正在想要从路由器层抽象逻辑(使交换路由器更容易!)。问题是在数据上下文发生变化之前获取数据。
为实现此目的,我建议您将Router.go
行转换为函数。这可能是在一个事件中,所以IR反应current()
在这里不会伤到你。
function changePath(path) {
if (path !== 'fields' && Router.current().route.name === 'fields') {
//do stuff
}
Router.go(path);
}
答案 1 :(得分:0)
我最终得到了我自己的完全通用的解决方案,使用与Router.current().location.get()
函数混合的被动 var Tracker.autorun
。因此,它与路由器配置100%独立,我认为这是一件好事。写在coffeescript。
使用琐碎:
Meteor.startup ->
RouterTransitions.register('/lists/' ,null,-> console.log("Switching from lists to any"))
预期行为:
/lists/*
更改为/(*)
(*)!='lists/'
时,hook
功能运行。 from /lists/ to /lists/1864f
不会触发挂钩)。但是,原点可以是目的地的子路径。 以下是来源:
class RouterTransitions
#could be any sequence of characters with at least one forbidden in URL standards (RFC 3986, section 2 characters)
WILDCARD:'>>'
constructor:->
Tracker.autorun =>
newPath=Router.current()?.location.get().path
if @_oldPath!=newPath
@_matchingDestinations.forEach (destinations) =>
origin=destinations.origin
Object.keys(destinations.targets).forEach (key) =>
if !newPath.match("#{origin}.*")&&(key==@WILDCARD or newPath.match("#{key}.*"))
#call the hook
destinations.targets[key]()
@_matchingOrigins =Object.keys(@dictionnary).filter (origin) => newPath.match("#{origin}.*")
@_matchingDestinations = @_matchingOrigins.map (key)=> {
targets:@dictionnary[key]
origin:key
}
@_oldPath=newPath
###
@param {String} origin : the namespace of the incoming path, null for any match. Origin can be a subset of destination.
@param {String} destination : the namespace of the forthcoming path, null for any match. Important! destination cannot be a subset of origin
@param {String} hook : the callback to be run on matching conditions
###
register:(origin,destination,hook) =>
origin=origin||@WILDCARD
destination=destination||@WILDCARD
if @dictionnary[origin]
@dictionnary[origin][destination]=hook
else
hooks=@dictionnary[origin]={}
hooks[destination]=hook
#A simple dict with keys='origin' and values plain objects with destinations mapped to hooks
dictionnary:{}
_oldPath:'/'
_matchingDestinations:[]
_matchingOrigins:[]
window.RouterTransitions=new RouterTransitions()