2013-02-12 34 views
7

Tôi đang cố chuyển hướng tuyến đường đến một tuyến khác trước khi thực hiện gọi lại tuyến đường. Tôi có đoạn mã sau:tuyến chuyển hướng đến một số khác

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); 

Phương pháp này kết thúc phương thức Backbone.History.navigate và hiển thị cảnh báo về cuộc gọi phương thức. Nhưng cảnh báo này không bao giờ xuất hiện khi tôi thay đổi tuyến đường.

Dòng console.log chỉ để đảm bảo rằng tệp đã được tải sau backbone.js.

Điều gì sai với mã này?

+1

Tôi cho rằng bạn đã gọi Backbone.history.start() ở đâu đó? – WiredPrairie

+0

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

+0

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

Trả lời

2

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 hashchangepopstate 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 Historyroute 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.

+0

hoàn hảo, nó phù hợp với tôi, cảm ơn – user606521

Các vấn đề liên quan