在某些路径更改中添加挂钩的最简洁方法是什么?

时间:2015-05-31 18:53:16

标签: meteor iron-router

我想在"路径命名空间"时添加一个钩子函数。变化。例如,当路由器从 myapp / 字段 / 9837278993 转到 myapp / 列表 / 183727856 时。当然,我可以在主onBeforeAction钩子中使用一些正则表达式条件逻辑。更抽象的逻辑将是#34;当命名空间从字段转到除字段之外的其他任何操作时。你有什么建议?谢谢你的帮助!

2 个答案:

答案 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()