【问题标题】:Backbone.Router route change event trigger twiceBackbone.Router 路由改变事件触发两次
【发布时间】:2013-02-11 22:39:01
【问题描述】:

这是我的 Coffescript 路由器类:

class App.Router extends Backbone.Router

  initialize: ->

    console.log 'Router.init'

    @on 'all', ->
      console.info 'route changed'

  routes:
    '': 'home'
    'test': 'test'

  home: ->
    console.log 'home routed'

  test: ->
    console.log 'test routed'

当我重新加载本地主机页面时,“@on 'all'”回调似乎触发了两次(我的萤火虫上的双重 console.info...)...

这是我的萤火虫输出:

App.init
Session.init
Router.init
home routed
route changed
route changed

如您所见,“路由已更改”输出位于我的主路由之后...

最后这是我的引导代码(带有我的 App 命名空间...),我在其中放置了 history.start

App =
  init: ->
    console.log 'App.init'
    @session = new App.Model.Session
    @router = new App.Router
    # @userPanel = new App.View.UserPanel
    Backbone.history.start pushState: true

  Model: {}
  View: {}

【问题讨论】:

    标签: javascript backbone.js coffeescript


    【解决方案1】:

    all 事件是一种特殊的事件侦听器语法,它捕获由源对象触发的任何类型的所有 事件。我猜另一个事件实际上根本不是route 事件,而是route:name 事件。

    要捕获所有路线,只需使用 route 事件即可:

    @on 'route', ->
      console.info 'route changed'
    

    【讨论】:

    • 好的,谢谢!问题解决了,在javascript事件方式T_T中我仍然有问题要思考。对了,为什么我的onRoute回调之前触发了home route?
    • @cl0udw4lk3r,这就是 Backbone 的实现方式。在routes 哈希中注册的路由回调在任何事件处理程序之前调用。
    【解决方案2】:

    这可以通过查看Backbone source来解释:

    this.trigger.apply(this, ['route:' + name].concat(args));
    this.trigger('route', name, args);
    

    尝试只监听 'route' 事件:

    @on 'route'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-07
      • 2020-01-31
      • 2014-04-07
      • 2013-10-31
      • 1970-01-01
      • 2013-03-28
      相关资源
      最近更新 更多