2012-03-07 15 views
37

Czy w trasie Backbone.js można ustawić parametry opcjonalne?Opcjonalny parametr trasy Backbone.js

np to:

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

zamiast:

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

odpowiedź Gabe H powinny być zaakceptowane odpowiedź, zamiast @mu jest zbyt krótki . –

+1

Tak! Zaawansowana technika! – TTT

+0

Trasy takie jak "szukaj /: zapytanie" nie działają dla mnie. Jednak "wyszukiwanie" działa dobrze. Dowolny pomysł? –

Odpowiedz

87

Od kręgosłupa 0.9.9 można dodawać opcjonalne parametry z nawiasami.

Na przykład w swoich tras obiektów można zdefiniować opcjonalną część trasy tak:

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

Teraz ścieżka url dopasuje /#organize i tras jak /#organize/create.

Pamiętaj, że jeśli potrzebujesz trasy jak /#organize/ (z tylnym ukośnikiem), aby uznać, można zrobić:

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

Jak radzisz sobie z działaniem w ramach displayOrganize? np. czy można zrobić "displayOrganize: function (action) {if (action) {// do stuff ...}}"? – 1nfiniti

+0

To powinna być zaakceptowana odpowiedź. –

3

Co na temat korzystania z *splat:

trasyrouter.routes

Trasa mapuje adresy URL z parametrami funkcji routera, podobnie jak hash zdarzeń widoku. Trasy mogą zawierać części parametrów, :param, które pasują do pojedynczego komponentu URL między ukośnikami; i splat części *splat, które mogą pasować do dowolnej liczby składników URL.

Na przykład trasa o numerze "search/:query/p:page" zostanie dopasowana do fragmentu #search/obama/p2, przekazując do akcji "obama" i "2". Trasa o numerze "file/*path" zostanie dopasowana do #file/nested/folder/file.txt, przekazując "nested/folder/file.txt" do działania.

8

Możesz dodać regex tras opartych ręcznie za pomocą the route method:

trasarouter.route(route, name, [callback])

ręcznie utworzyć trasę dla routera The route argumentem może być ciągiem routingu lub wyrażenie regularne. Każde pasujące przechwycenie z trasy lub wyrażenie regularne zostanie przekazane jako argument do wywołania zwrotnego.

Więc coś jak to powinno działać:

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

Następnie searchIndex byłoby uzyskać nazywane z niczego lub Twój :query jako jej argument.

Wadą jest to, że nie można wstawiać tras regex do obiektu routes. Możesz dodać wszystkie trasy z route do swojej metody routera initialize, jeśli chcesz zachować je wszystkie razem.

16

Prawdopodobnie najbardziej Najprostszym sposobem jest po prostu zadeklarować więcej niż jedna droga, jedna z dodatkową Arg, jeden bez:

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

potem po prostu sprawdzić na nich w sposób:

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

Note podoba mi się to znacznie lepiej niż dwie pozostałe odpowiedzi, ponieważ innym programistom bardzo łatwo jest zrozumieć, co się dzieje.

Powiązane problemy