2014-10-29 45 views
1

我希望能夠在「before」函數中停止路由觸發器。上面的功能很好。它正確地調用「before」方法。當「before」方法被調用時,有沒有合適的方法來停止路由?如何在觸發該功能之前停止Backbone路由事件?

更新:已解決!

(function() { 
    _.extend(Backbone.Router.prototype, Backbone.Events, {   
     route: function (route, name, callback) {   
      if (!_.isRegExp(route)) route = this._routeToRegExp(route); 
      if (!callback) callback = this[name]; 
      var router = this; 
      Backbone.history.route(route, _.bind(function (fragment) {    
       var args = this._extractParameters(route, fragment);     

       if (_.isFunction(router.before)) { 
        if (router.before.apply(this, args) === false) return; 
       } 
       callback && callback.apply(this, args); 
       this.trigger.apply(this, ['route:' + name].concat(args)); 
       if (_.isFunction(router.after)) { 
        router.after.apply(router, args); 
       } 
       Backbone.history.trigger('route', this, name, args); 
      }, this)); 
      return this; 
     } 
    }); 
}).call(this); 

這裏是路由器代碼:

var AppRouter = Backbone.Router.extend({ 
    routes: { 
     '': 'home', 
     'help(/)': 'help', // about or /about/ 
     'page(/:id)(/)' : 'page', 
     '*path' : 'notFound' 
    }, 
    before: function() { 
     return false; // the magic 
    }, 
    after: function() { 
    }, 
}); 

它工作的方式。返回false可以立即停止進程。完善。基於knpsck解決方案的解決方案。

回答

3

beforeafter掛鉤 - 是額外的功能。你可以這樣實現(Backbone 1.1.2)

Backbone.Router.prototype.route: function(route, name, callback) { 
     if (!_.isRegExp(route)) route = this._routeToRegExp(route); 

     if (_.isFunction(name)) { 
     callback = name; 
     name = ''; 
     } 

     if (!callback) callback = this[name]; 

     var router = this; 

     Backbone.history.route(route, function(fragment) { 
     var args = router._extractParameters(route, fragment); 

     if (_.isFunction(router.before)) { 
      if (router.before.apply(this, args) === false) return; 
     } 

     router.execute(callback, args); 

     if (_.isFunction(router.after)) { 
      router.after.apply(router, args); 
     } 

     router.trigger.apply(router, ['route:' + name].concat(args)); 
     router.trigger('route', name, args); 
     Backbone.history.trigger('route', router, name, args); 
     }); 

     return this; 
} 
+0

是的!有用!我不得不編輯一點。例如,if(_.isFunction(router.after){'line')中缺少一個'''',並且我必須對該函數的開始部分進行封裝,請查看更新後的問題。 – kastelli 2014-10-30 12:36:59

+1

是的,錯過了支持。更新 – knpsck 2014-10-30 12:40:37

+0

對不起,但你的擴展在同一時間前後調用。我把你的代碼和別人的代碼合併。我修改了代碼並且現在工作很好,請再次看到更新後的問題。 – kastelli 2014-10-30 13:37:14

相關問題