2012-06-06 32 views
10

Tôi muốn có mọi yêu cầu trang chuyển hướng đến index.html của tôi, và bất kỳ link (không #urls -/thực/url) nhấp vào ứng dụng của tôi chạy qua router.js do đó về cơ bản là không có trang làm mới - thuần túy ajax. Có cách nào dễ dàng để làm điều này với Backbone định tuyến và htaccess?Backbone Router không làm việc với pushState

Tôi làm việc tại thời điểm này nếu tôi lấy đi {pushState: true} và định dạng các liên kết của tôi như #login. Tuy nhiên, khi tôi kích hoạt pushState và nhấp vào #login, không có gì xảy ra. Thay vào đó, nó chỉ là một lần tôi làm mới trang mà Backbone diễn giải #login và đi theo lộ trình để hiển thị loginView.

Đây là router của tôi:

// Filename: router.js 
define([ 'views/beta/requestInvite', 'views/beta/login' ], 
function(requestInviteView, loginView) { 
    var AppRouter = Backbone.Router.extend({ 
     routes : { 
      // Pages 
      'login' : 'login', 

      // Default 
      '*actions' : 'defaultAction' 
     }, 

     // Pages 
     login : function() { 
      loginView.render(); 
     }, 

     defaultAction : function(actions) { 
      requestInviteView.render(); 
     } 
    }); 

    var initialize = function() { 
     var app_router = new AppRouter; 
     Backbone.history.start({pushState: true}); 
    }; 
    return { 
     initialize : initialize 
    }; 
}); 

Những gì tôi muốn xảy ra là trong requestInviteView, khi liên kết đến /login được nhấp, những thay đổi url để /loginloginView được trả lại.

Cảm ơn bạn đã trợ giúp!

Trả lời

10

Thay đổi từ băm thành pushstate không phải là tầm thường khi thay đổi tham số đơn lẻ vì có thể dẫn đến suy nghĩ. Những gì tôi làm là bắt sự kiện nhấp trong chế độ xem của tôi và gọi app.navigate để kích hoạt tuyến đường.

app.navigate("/login", {trigger: true}); 

http://backbonejs.org/#Router-navigate

+0

Bạn có thể thực hiện điều này một cách tự động bằng phương pháp tương tự [this gist] (https : //gist.github.com/colllin/5717284). – colllin

5

Mặc dù câu trả lời của Anthony sẽ làm việc, sử dụng trigger: true thường không phải là hành động tốt nhất. Thay vào đó, ứng dụng của bạn nên được cấu trúc để bạn có thể gọi navigate với giá trị mặc định trigger còn lại để false.

Derick Bailey nói về vấn đề trên blog của mình tại http://lostechies.com/derickbailey/2011/08/28/dont-execute-a-backbone-js-route-handler-from-your-code/ (đoạn "The‘AHA!’Moment Về Đối số thứ hai Router.Navigate của")

Bên cạnh đó, toàn bộ một chương giải thích định tuyến một cách chi tiết hơn (bao gồm cả lý do tại sao bạn nên để lại trigger thành false) có thể được tải xuống miễn phí trong mẫu sách pdf này: http://samples.leanpub.com/marionette-gentle-introduction-sample.pdf (tiết lộ đầy đủ: Tôi là tác giả sách)

+1

thú vị, nhưng sao chép logic cho mỗi bộ điều khiển chỉ để tránh một tham số thứ hai có vẻ dư thừa. tôi có những tình huống hiếm hoi trong đó tôi sử dụng điều này (ví dụ: khi một tuyến đường được yêu cầu ra khỏi thứ tự tôi thay đổi nó trên bay và làm cho xem thích hợp). bối cảnh của câu hỏi này là để kích hoạt một hành động sau khi một liên kết được nhấp vào, và tôi thấy nó kích hoạt nó như là tốt nhất của việc này. – Garrett

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