2013-02-13 24 views
9

Tôi có ứng dụng Backbone. Tôi đang sử dụng Backbone.history để cho phép sử dụng nút quay lại. Chúng tôi có một trang (cài đặt) tự động tải cửa sổ bật lên yêu cầu đầu vào từ người dùng. Nếu người dùng chọn hủy, tôi muốn quay lại trang trước. Tôi có thể làm điều này bằng cách sử dụng window.history.back().Lịch sử chọn lọc.back() bằng Backbone.js

Vấn đề là, nếu người dùng truy cập trực tiếp trang đó (ứng dụng # cài đặt) từ url khác (như google) bằng cách nhập url vào trình duyệt, tôi muốn chuyển hướng người dùng đến trang chủ (app /) thay vì quay lại google.

Tôi chưa thể tìm ra cách nào để thực hiện việc này. Backbone.history trông giống như nó lưu trữ thông tin từ nút quay lại của trình duyệt, vì vậy nó có một lịch sử ngay cả khi họ vừa mới đến ứng dụng. Tôi cũng không thể tìm thấy cách để xem url trước đó.

Điều này có khả thi không?

Trả lời

24

Quấn logic điều hướng quay lại theo cách của riêng bạn. Có lẽ trên router:

var AppRouter = Backbone.Router.extend({ 

    initialize: function() { 
    this.routesHit = 0; 
    //keep count of number of routes handled by your application 
    Backbone.history.on('route', function() { this.routesHit++; }, this); 
    }, 

    back: function() { 
    if(this.routesHit > 1) { 
     //more than one route hit -> user did not land to current page directly 
     window.history.back(); 
    } else { 
     //otherwise go to the home page. Use replaceState if available so 
     //the navigation doesn't create an extra history entry 
     this.navigate('app/', {trigger:true, replace:true}); 
    } 
    } 
}); 

Và sử dụng phương pháp định tuyến để điều hướng trở lại:

appRouter.back(); 
+5

cách tiếp cận này tính mọi tuyến đường bao gồm cả điều hướng của trình duyệt trở lại. Hãy nói rằng tôi đang điều hướng đến 3 tuyến đường bên trong ứng dụng của tôi, sau đó routesHit sẽ là 3. Bây giờ bằng cách sử dụng nút quay lại trình duyệt sẽ không làm giảm routesHit (thay vì tăng nó) và trình duyệt cuối cùng sẽ đưa bạn ra khỏi ứng dụng của bạn. –

3

tôi đã sử dụng câu trả lời tương tự từ jevakallio, nhưng tôi đã có cùng một vấn đề mà commenter Jay Kumar có: Các routesHit không trừ để đánh appRouter.back() đủ thời gian sẽ đưa người sử dụng ra khỏi ứng dụng, vì vậy tôi đã thêm 3 dòng:

var AppRouter = Backbone.Router.extend({ 

    initialize: function() { 
    this.routesHit = 0; 
    //keep count of number of routes handled by your application 
    Backbone.history.on('route', function() { this.routesHit++; }, this); 
    }, 

    back: function() { 
    if(this.routesHit > 1) { 
     //more than one route hit -> user did not land to current page directly 
     this.routesHit = this.routesHit - 2; //Added line: read below 
     window.history.back(); 
    } else { 
     //otherwise go to the home page. Use replaceState if available so 
     //the navigation doesn't create an extra history entry 
     if(Backbone.history.getFragment() != 'app/') //Added line: read below 
     this.routesHit = 0; //Added line: read below 
     this.navigate('app/', {trigger:true, replace:true}); 
    } 
    } 
}); 

Và sử dụng ro uter phương pháp để điều hướng trở lại:

appRouter.back(); 

thêm dòng:

1st một: Trừ 2 từ routesHit, sau đó khi chuyển hướng của nó đến trang "lại" nó sẽ đạt được 1 do đó, nó thực sự như bạn đã làm chỉ a trừ 1.

Câu hỏi thứ hai: nếu người dùng đã ở "nhà riêng", sẽ không có chuyển hướng, do đó, đừng làm bất cứ điều gì để routesHit.

Phần thứ ba: Nếu người dùng là nơi anh ta bắt đầu và đang được gửi về "nhà", hãy đặt routesHit = 0, sau đó khi được chuyển hướng đến "nhà" routesHit sẽ là 1 lần nữa.

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