Backbone.js - вызов метода до / после запуска маршрута - PullRequest
9 голосов
/ 13 сентября 2011

Я хочу, чтобы метод setup / teardown вызывался до и после запуска маршрута в моем маршрутизаторе Backbone.js соответственно. Кто-нибудь создал элегантный способ сделать это?

Ответы [ 13 ]

0 голосов
/ 16 октября 2013

Вот версия JavaScript, которая работает с тем, что у меня есть;

var rp = Backbone.Router.prototype;
rp.routeWithoutEvents = rp.route;
rp.route = function(route, name, callback) {
    if (!callback) callback = this[name];
    this.routeWithoutEvents(route, name, function() {
        this.before.apply(this);
        callback.apply(this,arguments);
        this.after.apply(this);
    });
};

Он основан на решениях Алексея Петрушина и Джонатана Трана.

0 голосов
/ 04 октября 2013

после выполнения гораздо большего количества манипуляций. я пришел к решению, которое я дал ниже ...... Вот ваша оригинальная корневая функция ...

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); callback && callback.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; }

Теперь посмотрите на этот код и измените функцию «route» на ваш оригинальный Backbone.js ...

  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) {    
                   // takes matched route & fragment as like 'route1'
  var args = router._extractParameters(route, fragment); 
                  // extracts arguments if exists

 // here yours self invoking function or other function starts....

(function(){
                             // do something
 if ( true )                 // condition satisfies then route to the given Route
    {
     callback && callback.apply(router, args); 
    }
  else{
     name='route2';          // change name of route
     window.location.hash = 'route2';
     callback= function(){
                             // optional callback if u want
      }
     callback && callback.apply(router, args);  // route to ur custome Route
    }

 })();


  });
  return this;
}

----- Спасибо -------- Люблю 2 пишу Грязные Коды! @xy ....

0 голосов
/ 23 мая 2013

ethnagnawl и Алексей оба правы; _.wrap - правильное решение, но если у вас есть куча маршрутов и вы пишете их обычным образом, это будет боль. Я понял, что вы можете сделать это:

var Pages = {}
Pages.loginPage = function(){ ... }
Pages.mainPage = function(){ ... }

Вместо того, чтобы определять свои обработчики маршрута непосредственно в Router.extend, загрузите их в объект и затем сделайте следующее:

_.map(Pages,function(func,name){                                                     
    Pages[name] = _.wrap(func,function(funky){                                       
        // Save original arguments                                                   
        var args = Array.prototype.slice.call(arguments,1);                          
        // Do stuff before the route                                                               
        funky(args);               
        // Do stuff after the route                                                  
    });                                                                              
});                                    

Это также позволяет довольно легко проверять имя функции, если вам нужно обрабатывать их подмножество по-другому или что-то в этом роде. Тогда, поскольку это просто объект, вы можете сделать это:

var myRouter = Backbone.Router.extend({
    routes: ... /* as usual */
    }).extend(Pages);       

И все готово.

Одним приятным преимуществом этого является то, что он не мешает прототипам Backbone, поэтому даже если обновление версии что-то изменит, это вас не укусит.

...