2012-03-07 42 views
37

Có thể có các tham số tùy chọn trong tuyến đường Backbone.js không?Tham số tùy chọn tuyến đường Backbone.js

ví dụ này:

routes: 
    "search/[:query]": "searchIndex" 

thay vì:

routes: 
    "search/": "searchIndex" 
    "search/:query": "searchIndex" 
+1

câu trả lời Gabe H nên là câu trả lời được chấp nhận, chứ không phải là @mu là quá ngắn . –

+1

Có! Techmology tiên tiến! – TTT

+0

Các tuyến đường như "tìm kiếm /: truy vấn" không hoạt động đối với tôi. Tuy nhiên "tìm kiếm" đang hoạt động tốt. Bất kỳ ý tưởng? –

Trả lời

87

Với Backbone 0.9.9, bạn có thể thêm các tham số tùy chọn bằng dấu ngoặc đơn.

Ví dụ trong tuyến đường của bạn đối tượng bạn có thể xác định một phần tuyến đường bắt buộc như thế này:

routes: { 
    "organize(/:action)": "displayOrganize" 
} 

Bây giờ con đường url sẽ phù hợp /#organize và các tuyến đường như /#organize/create.

Hãy ghi nhớ rằng nếu bạn cần các tuyến đường như /#organize/ (với một dấu gạch chéo) để được công nhận, bạn có thể làm:

routes: { 
    "organize(/)(:action)": "displayOrganize" 
} 
+0

Bạn xử lý hành động trong displayOrganize như thế nào? tức là bạn có thể thực hiện 'displayOrganize: function (action) {if (action) {// do stuff ...}}'? – 1nfiniti

+0

Đây phải là câu trả lời được chấp nhận. –

3

gì về việc sử dụng *splat:

tuyếnrouter.routes

Các tuyến đường băm ánh xạ các URL với các tham số đến các chức năng trên bộ định tuyến của bạn, tương tự như băm sự kiện của View. Các tuyến đường có thể chứa các phần tham số, :param, khớp với một thành phần URL duy nhất giữa các dấu gạch chéo; và các bộ phận tách rời *splat, có thể khớp với bất kỳ số lượng thành phần URL nào.

Ví dụ: tuyến đường "search/:query/p:page" sẽ khớp với một đoạn #search/obama/p2, đi qua "obama""2" để thực hiện hành động. Tuyến đường "file/*path" sẽ khớp với #file/nested/folder/file.txt, đi qua "nested/folder/file.txt" đến hành động.

8

Bạn có thể thêm đường khác dựa regex bằng tay sử dụng the route method:

đườngrouter.route(route, name, [callback])

thủ tạo ra một lộ trình cho các bộ định tuyến, Đối số route có thể là một chuỗi định tuyến hoặc biểu thức chính quy. Mỗi lần chụp phù hợp từ tuyến đường hoặc biểu thức chính quy sẽ được chuyển làm đối số cho cuộc gọi lại.

Vì vậy, một cái gì đó như thế này nên làm việc:

this.route(/^search\/(.*)?/, 'searchIndex'); 

Sau đó searchIndex sẽ được gọi với không có gì hoặc :query như là đối số của nó của bạn.

Nhược điểm là bạn không thể đặt các tuyến đường regex vào đối tượng routes của mình. Bạn có thể thêm tất cả tuyến đường của mình với route bên trong phương thức initialize của bộ định tuyến nếu bạn muốn giữ tất cả chúng lại với nhau.

16

Có lẽ cách dễ nhất nhất là chỉ cần khai báo nhiều hơn một con đường, một với arg thêm, người ta không:

routes:{ 
     "authProxy/:hash": "authProxy",                                         
     "authProxy/:hash/:url": "authProxy" 
} 

sau đó chỉ cần kiểm tra chúng trong phương pháp của bạn:

authProxy: function(hash, url){ 
    if (url){ 
     // Hash and URL. 
    }else{ 
     // Just hash. 
    } 
} 

Note mà tôi thích điều này tốt hơn nhiều so với hai câu trả lời khác bởi vì nó rất dễ dàng cho một nhà phát triển khác để hiểu những gì đang xảy ra.

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