перенаправление на другой маршрут
Я пытаюсь перенаправить маршрут на другой, прежде чем обратный вызов маршрута будет выполнен. У меня есть следующий фрагмент кода:
console.log("file loaded");
(function (History) {
var _navigate = History.prototype.navigate;
_.extend(History.prototype, {
navigate: function (fragment, opts) {
alert("adad");
return _navigate.call(this, fragment, opts);
}
});
})(Backbone.History);
этот код обертывает Backbone.History.navigate метод и отображение предупреждения при вызове метода. Но это предупреждение не появляется, когда я меняю маршруты.
на console.log line - это просто убедиться, что файл был загружен после магистрали.js.
что не так с этим кодом?
1 ответов
я думаю, вы переопределяете неправильную вещь: это navigate не используется так, как вы думаете.
давайте посмотрим на часть Backbone.history.start:
// Start the hash change handling, returning `true` if the current URL matches
// an existing route, and `false` otherwise.
start: function(options) {
//...
if (this._hasPushState) {
Backbone.$(window).on('popstate', this.checkUrl);
} else if (this._wantsHashChange && ('onhashchange' in window) && !oldIE) {
Backbone.$(window).on('hashchange', this.checkUrl);
} else if (this._wantsHashChange) {
this._checkUrlInterval = setInterval(this.checkUrl, this.interval);
}
вы увидите, что все различные способы обработки маршрутизации в магистрали проходят через checkUrl, а не navigate. The checkUrl метод делает немного занятой работы и вызывает loadUrl; один часть напряженной работы это:
if (this.iframe) this.navigate(current);
так navigate будет вызываться, но только когда <iframe> используется для имитации hashchange и popstate события и AFAIK, которые происходят только при использовании более старой версии IE.
вернуться к обычному пути через код. Мы видели это checkUrl делает некоторые занятые работы и звонки loadUrl так что же делать? loadUrl это:
loadUrl: function(fragmentOverride) {
var fragment = this.fragment = this.getFragment(fragmentOverride);
var matched = _.any(this.handlers, function(handler) {
if (handler.route.test(fragment)) {
handler.callback(fragment);
return true;
}
});
return matched;
}
если вы посмотрите на route метод History и route метод Route вы увидите, что handler.callback вызывает обработчик маршрута от одного из ваших маршрутизаторов и запускает событие маршрутизации.
на navigate метод, который вы заменяете, в значительной степени используется только Router ' s navigate:
navigate: function(fragment, options) {
Backbone.history.navigate(fragment, options);
return this;
}
если вы хотите перенаправить перед вызовом обработчика маршрута, вы можете заменить loadUrl что-то вроде этого:
(function(History) {
var _loadUrl = History.prototype.loadUrl;
_.extend(History.prototype, {
loadUrl: function() {
var args = [].slice.apply(arguments);
args[0] = this.getFragment(args[0]);
// If args[0] is the fragment that you want to
// redirect then replace it here or do whatever
// needs to be done.
return _loadUrl.apply(this, args);
}
});
})(Backbone.History);
демо:http://jsfiddle.net/ambiguous/e4KYK/
в целом я думаю вам лучше обрабатывать перенаправление в обычном обработчике маршрута: когда вызывается оскорбительный маршрут, просто вызовите navigate на любом маршрутизаторе удобно.
имейте в виду, что Backbone.History не документируется за пределами start метод так что все здесь может измениться.