Tôi nghĩ bạn đang ghi đè điều sai: rằng navigate
không được sử dụng theo cách bạn nghĩ.
Chúng ta hãy nhìn một phần của 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);
}
Bạn sẽ thấy rằng tất cả các cách khác nhau xử lý định tuyến trong Backbone đi qua checkUrl
hơn navigate
. Phương thức checkUrl
thực hiện một số công việc bận rộn và gọi số loadUrl
; một part of the busy work is this:
if (this.iframe) this.navigate(current);
nên navigate
sẽ được gọi nhưng chỉ khi một đang được sử dụng để mô phỏng hashchange
và popstate
sự kiện và AFAIK đó chỉ xảy ra khi bạn đang sử dụng một phiên bản cũ của IE.
Quay lại đường dẫn thông thường thông qua mã. Chúng tôi đã thấy rằng checkUrl
thực hiện một số công việc bận rộn và gọi số loadUrl
để điều đó làm gì? 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;
}
Nếu bạn nhìn vào route
method in History
và route
method in Route
bạn sẽ thấy rằng handler.callback
là những gì gọi là xử lý tuyến đường từ một trong các router của bạn và gây nên sự kiện định tuyến.
Các navigate
phương pháp mà bạn đang thay thế là khá nhiều chỉ được sử dụng bởi Router
's navigate
:
navigate: function(fragment, options) {
Backbone.history.navigate(fragment, options);
return this;
}
Nếu bạn muốn chuyển hướng trước khi xử lý tuyến đường được gọi, bạn có thể thay thế loadUrl
với một cái gì đó như thế này:
(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);
Demo: http://jsfiddle.net/ambiguous/e4KYK/
Nói chung tôi nghĩ rằng bạn muốn được tốt hơn tắt xử lý chuyển hướng trong trình xử lý tuyến đường thông thường: khi tuyến đường vi phạm được gọi, chỉ cần gọi navigate
trên bất kỳ bộ định tuyến nào thuận tiện.
Hãy ghi nhớ rằng Backbone.History
không ghi nhận ngoài start
method để mọi thứ ở đây có thể thay đổi.
Tôi cho rằng bạn đã gọi Backbone.history.start() ở đâu đó? – WiredPrairie
vâng tôi đã làm - quan điểm của tôi đang thay đổi, tôi không biết tại sao điều này không làm việc – user606521
Nó phải là cái gì khác.Tôi vừa mới cắm mã của bạn vào một dự án Backbone mà tôi đã mở, và ngay lập tức tôi đã bực mình vì cảnh báo 'adad' ngay khi tôi điều hướng. :) Tôi đã có thẻ neo mã boilerplate để "Điều hướng" mã được cắm vào ứng dụng của tôi, điều này có thể thay đổi hành vi. – WiredPrairie