Программно добавлять маршруты в Backbone.Router? - PullRequest
9 голосов
/ 07 марта 2012

Вот мой application-router.js файл, в котором я создаю Backbone.Router объект только с несколькими маршрутами:

var App = App || {};

App.Router =  Backbone.Router.extend({
    routes : {
        ''      : 'showDashboard', // Not shown
        '*other': 'showModalError'
    },
    defaultRoute : function(other) { $('#modal404').modal(); }
});

В основном файле javascript application.js я хотел бы программно добавить маршруты.Я пробовал с route () функцией, и она не работает, маршруты не добавляются.Однако он работает, передавая объект конструктору, но он переопределяет уже определенные маршруты:

// This works and overrides all defined routes in App.Router
var router = new App.Router({ routes : { '/test/me' : 'testRoute' } });

// This is not working
router.route(ExposeTranslation.get('customers.new.route'), 'newCustomer');
router.route('/test/me/again', 'testAgainRoute');

На самом деле console.log(App.Router) показывает:

routes Object { /test/me="testRoute"}

Полагаю, яупустив что-то, чего я не могу понять, я начинаю изучать этот маленький кусочек мощного JavaScript.

1 Ответ

14 голосов
/ 07 марта 2012

Ваши router.route звонки работают, эти звонки не ваша проблема. Когда вы звоните route, чтобы добавить новый маршрут, новый маршрут идет в конце списка маршрутизации. В частности, маршруты, добавленные вашими вызовами route, идут после '*other' и '*other', и все совпадения будут совпадать, поэтому ваши новые маршруты будут эффективно игнорироваться.

Попробуйте удалить маршрут '*other' из routes и добавить его после двух вызовов route():

routes : {
    ''      : 'showDashboard' // Not shown
},

router.route(ExposeTranslation.get('customers.new.route'), 'newCustomer');
router.route('/test/me/again', 'testAgainRoute');
router.route('*other', 'showModalError');

Маршруты не хранятся в App.Router объекте, они хранятся внутри Backbone.history:

route: function(route, name, callback) {
  // ...
  Backbone.history.route(route, _.bind(function(fragment) {
    //...
  }, this));
  return this;
},

Вот почему ваш console.log(App.Router) не говорит ничего полезного.

...