2012-03-21 24 views
11

Khả năng đó có tồn tại không? Trang web của chúng tôi không phải là một trang, nhưng tất cả các tệp js được nén bên trong application.js, tôi có thể sử dụng bộ định tuyến đường trục cho phân tích location.path không?Cách áp dụng bộ định tuyến đường trục cho đường dẫn đầy đủ, không phải là băm

Tôi thử Backbone.history.start(pushState: true). Nó làm việc cho tôi, nhưng nó có đúng không? Tôi chỉ cần phân tích cú pháp ban đầu, không phải các tuyến đường và chuyển hướng phức tạp qua Backbone.Router.

+0

Bạn đang cố gắng làm gì? Bạn có thể có một số ví dụ và những gì bạn đã thử? – tkone

+0

ví dụ, khi tôi mở đường dẫn '/ testimonials' Tôi muốn thực hiện một số chức năng (trong bộ định tuyến). Đó là tất cả những gì tôi cần, vì tất cả các mô-đun của tôi nằm bên trong 'application.js' (đó là ứng dụng đường ray). Và tôi muốn biết, những gì tôi nên thực hiện ... – ValeriiVasin

Trả lời

13

Bạn chỉ có thể sử dụng bộ định tuyến chuẩn. Khi bạn khởi tạo nó và khởi động đối tượng lịch sử, bạn có thể thiết lập thư mục gốc mà nó nên sử dụng làm cơ sở của nó. Trong trường hợp này có vẻ như bạn muốn sử dụng '/'

var MyRouter = Backbone.Router.extend({ 
    routes: { 
     "application/": "somefunc" 
    } 
} 

var app = new MyRouter(); 
Backbone.history.start({pushState: true, root: '/'}); 

Bạn sẽ cần phải thiết lập máy chủ web của bạn để phục vụ lên tập tin HTML của bạn bất cứ khi nào bất kỳ thư mục được gọi là trên máy chủ của bạn (để xương sống, không đường ray, sẽ xử lý các tuyến đường của bạn).

Cuối cùng, trong tệp HTML, tôi có một hàm chạy trên Dom sẵn sàng và kéo đường dẫn ra khỏi URL và chuyển nó đến navigate.

var path = location.pathname; 
app.navigate(path, {trigger: true}); 
+0

Có một vấn đề với IE ... IE không có pushState và Router luôn luôn đi đến '# my-path' thay vì'/my/path' .. Có thể sửa chữa nó? – ValeriiVasin

+1

@InviS No. 'pushState' chỉ hoạt động trên trình duyệt hỗ trợ đối tượng Lịch sử HTML5. [Xương sống đặc biệt sẽ trở lại giải pháp băm [(http://documentcloud.github.com/backbone/#History-start) trên các trình duyệt không được hỗ trợ. Vấn đề với các trình duyệt không hỗ trợ 'pushState' là trình duyệt sẽ tạo một yêu cầu mới khi bạn cung cấp cho nó một URL hợp lệ thông qua việc sửa đổi đối tượng' location'. – tkone

+0

Nhưng tôi không cần pushState chút nào ... Tôi đang sử dụng nó để xác định vị trí trên trang của tôi ... Có phương pháp nào để làm điều đó không? cách đặt điều hướng mặc định từ đường dẫn gốc '/', không phải '#'. – ValeriiVasin

0

Bạn sẽ cần phải viết bộ định tuyến của riêng mình, nhưng may mắn thay điều đó khá dễ dàng. Dưới đây là một tôi chỉ viết cho một trang web tôi đang làm việc trên:

var routes = { 
    "terms": "terms", 
    "privacy": "privacy", 
    "password-reset": "reset" 
}; 

var path = window.location.pathname.replace("/", ""); 
var page = routes[path]; 
if (!page) { 
    page = "404"; 
} 

Tôi không cần bất kỳ khớp ưa thích cai trị Backbone cung cấp, nhưng nó sẽ không quá khó để mở rộng ý tưởng này với bình thường biểu thức. Hoặc có lẽ ai đó có thể viết một mô-đun nhỏ sử dụng logic kết hợp của Backbone nhưng không thực hiện chuyển hướng hash/pushState.

+0

đó là ví dụ khá đơn giản. Thông thường, các tuyến đường không đơn giản như vậy và bạn có thể thấy cần phải cung cấp tuyến đường như thế này: '/ hello/world /: post /: date' – ValeriiVasin

-1

Tôi gặp vấn đề tương tự với IE, có một sự sollution đơn giản. Tải xuống modernizr và bao gồm nó.

Sau đó làm:

Backbone.history.start({ pushState: Modernizr.history }); 

này nên làm các trick.

+1

Backbone tự động phát hiện nếu trình duyệt có pushState và sẽ quay trở lại băm nếu pushState không được hỗ trợ, vì vậy điều này là không cần thiết - chỉ cần đặt pushState thành true trong history.start. –

1

Tôi đang sử dụng này:

window.location.href.replace(Backbone.history.getFragment(), ''); 

để có được url tuyệt đối của gốc xương sống của ứng dụng.

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