gpt4 book ai didi

backbone.js - 重定向路由到另一个

转载 作者:行者123 更新时间:2023-12-04 12:48:27 26 4
gpt4 key购买 nike

我试图在执行路由回调之前将路由重定向到另一个。我有以下一段代码:

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行只是为了确保文件已在backbone.js 之后加载。

这段代码有什么问题?

最佳答案

我认为您忽略了错误的内容: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);
}

你会看到所有在 Backbone 中处理路由的各种方式都通过 checkUrl而不是 navigate . checkUrl方法做一些繁忙的工作并调用 loadUrl ;一 part of the busy work is this :
  if (this.iframe) this.navigate(current);

所以 navigate只会在 <iframe> 时被调用用于模拟 hashchangepopstate仅当您使用旧版本的 IE 时才会发生的事件和 AFAIK。

回到通常的代码路径。我们已经看到 checkUrl做一些忙碌的工作并打电话 loadUrl那有什么作用呢? loadUrl does this :
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 method in History route method in 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 method 之外所以这里的一切都可能发生变化。

关于backbone.js - 重定向路由到另一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14840007/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com