Я хочу выделить текущее состояние навигации.Например, если hashchange равен #home
, я хочу по-другому оформить ссылку меню «Домой» и аналогично другим ссылкам.
Backbone.js запускает отдельные события, такие как route:home
, ... route:some-other
, когда#home
и другие ссылки нажимаются.Я не мог видеть ни одного обычного события, которое будет запускаться для каждого хэша.После этого мне необходимо написать логику выделения состояния, привязав все события маршрута, что, на мой взгляд, не является хорошим решением.
Итак, я переопределил Backbone.Router.route
в моем подклассе / объекте маршрутизатора,как
// override backbone' Router.route method to publish
// common 'route_change' event for any hash change
route : function(route, name, callback) {
Backbone.history || (Backbone.history = new Backbone.History);
if (!_.isRegExp(route)) route = this._routeToRegExp(route);
Backbone.history.route(route, _.bind(function(fragment) {
var args = this._extractParameters(route, fragment);
callback.apply(this, args);
this.trigger.apply(this, ['route:' + name].concat(args));
// ADDED BY: ManiKanta G
// name: route method
// fragment: route path
// args: any additional args
this.trigger.apply(this, ['route_change'].concat(name, fragment, args));
}, this));
}
Это будет публиковать общее событие route_change
для каждого хешигена и передачи name
, fragment
и других args
, используя которые я выделяю состояние в одном месте..
Мой вопрос заключается в том, нужно ли мне переопределять метод Backbone, как этот, или есть какой-нибудь механизм сборки, который я могу использовать здесь.Если нет, я хотел бы видеть подобное поведение в Backbone.js
Редактировать: пример программы
Router = Backbone.Router.extend({
routes : {
'': 'root',
'home': 'home',
'about':'about'
},
// app routing methods
root: function () { console.log('root route'); },
home: function () { console.log('home route'); },
about: function () { console.log('about route'); }
});
Router.bind('all', function () {
console.log('all route...');
});
router = new Router();
и навигацию с использованиемвышеупомянутый маршрутизатор:
router.navigate('home', true);
выход: home route
Обновление о том, почему вышеуказанная программа не работает:
мы должны связать событие all
с Router instance
, но не с самим Router
, поэтому изменение Router.bind('all', ...
на router.bind('all', ...)
заставит вышеуказанную программу работать