【问题标题】:Backbone router events骨干路由器事件
【发布时间】:2012-01-19 07:41:18
【问题描述】:

Backbone.Router 中是否存在执行路由之前和之后的事件? 我的应用程序与jQuery.mobile 一起使用,并且在执行路由之前需要调用$.mobile.changePage,并且在控制器中可以访问$.activePage 当前显示的页面。控制器操作完成后,我应该触发文档上的create 事件,以通过 $.mobile 新创建的元素获得“增强”。 我通过替换 loadUrl 来做到这一点

Backbone.history.loadUrl = ( function( old  ){
    return function() {  
       Router.trigger("all:before");   
       old.apply( Backbone.history, arguments );
       Router.trigger("all:after" );
    }
})( Backbone.history.loadUrl  );



 //Router.initialize
 initialize: function() {
     this.bind( "all:before", function( ) {  
         $.mobile.changePage( window.location.hash.split( "/" )[0] || "home", { changeHash:false} );
     });

     this.bind( "all:after", function() {
       $.mobile.activePage.trigger('create'); 
     });  
  }

可能有一些这样的内置事件吗?

【问题讨论】:

  • 离题了,但我喜欢你包装 Backbone.history.loadUrl 函数的方式。真的很干净!

标签: javascript backbone.js backbone-events


【解决方案1】:

到目前为止,Backbone.Router 中没有前后事件。

0.5.3 版支持以下路由器事件 (all events here)

"route:[name]" (router) — 当一个路由器的路由匹配时。

不确定它会发布到哪个版本,但正在开发一个通用路线事件, 在github的主干commit #419有这个功能,但是还没有发布新版本

之前的事件已经报告了问题(想法),请在此处查看github issue on that

所以,之前的事件还没有出现,之后的事件会在一段时间后出现, 如果你真的已经需要一个事后活动,有一种方法可以让你自己动手, 通过绑定到 'all' 事件,它会捕获所有事件,包括所有 'route:routename' 事件。然后只需拆分事件名称,如果它以 route 开头,您就有一般的 route 事件。 (如果 after 事件在主干的版本之一中发布,这当然可以删除和更改)

    this.bind('all', function (trigger, args) {
               var routeData = trigger.split(":");
                if (routeData[0] === "route") {
                   // do whatever here.  
                   // routeData[1] will have the route name
                }
        });

【讨论】:

  • 请注意,“all”事件(在我见过的所有情况下都被触发)是最后一个。因此,在路由的情况下,它更像是一个事后事件。
  • backbone 1.0 版现在有 "route" 事件
  • "route" 事件直到之后才会触发
猜你喜欢
  • 2012-12-15
  • 2011-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-11
  • 2012-06-26
相关资源
最近更新 更多