Czy za pomocą Backbone mogę uzyskać nazwę bieżącej trasy? Wiem, jak powiązać zdarzenia zmiany trasy, ale chciałbym móc określić bieżącą trasę w innym czasie, pomiędzy zmianami.
backbone.js
Drew Dara-Abrams
źródło
źródło
Odpowiedzi:
Jeśli utworzyłeś wystąpienie routera w swojej aplikacji, poniższy wiersz zwraca bieżący fragment:
Z dokumentacji Backbone.js :
„[...] Historia służy jako router globalny (na ramkę) do obsługi zdarzeń związanych z hashchange lub pushState, dopasowywania odpowiedniej trasy i wywoływania wywołań zwrotnych. Nigdy nie powinno być konieczne samodzielne tworzenie jednego z nich - należy użyć odniesienia do Backbone.history, który zostanie utworzony automatycznie, jeśli użyjesz routerów z trasami. [...] "
Jeśli potrzebujesz nazwy funkcji związanej z tym fragmentem, możesz zrobić coś takiego w zasięgu routera:
Lub w ten sposób spoza routera:
źródło
Backbone.history.getFragment()
, ponieważBackbone.history.fragment
jest to prywatna ukryta własność.Odpowiedź Roberta jest interesująca, ale niestety zadziała tylko wtedy, gdy hash jest dokładnie taki, jak zdefiniowano w trasie. Jeśli na przykład masz trasę,
user(/:uid)
nie zostanie ona dopasowana, jeśliBackbone.history.fragment
jest to albo"user"
albo"user/1"
(oba są dwoma najbardziej oczywistymi przypadkami użycia takiej trasy). Innymi słowy, znajdzie odpowiednią nazwę wywołania zwrotnego tylko wtedy, gdy hash jest dokładnie"user(/:uid)"
(bardzo mało prawdopodobne).Ponieważ potrzebowałem tej funkcjonalności, rozszerzyłem funkcję
Backbone.Router
a,current
która ponownie wykorzystuje część kodu używanego przez obiekt Historia i Router w celu dopasowania bieżącego fragmentu do zdefiniowanych tras w celu wyzwolenia odpowiedniego wywołania zwrotnego. W moim przypadku przyjmuje opcjonalny parametrroute
, który, jeśli jest ustawiony na cokolwiek prawdziwe, zwróci odpowiednią nazwę funkcji zdefiniowaną dla trasy. W przeciwnym razie będzie to powrót aktualny hash-fragment zBackbone.History.fragment
.Możesz dodać kod do istniejącego rozszerzenia Extend, w którym zainicjujesz i skonfigurujesz router Backbone.
Jestem pewien, że można by wprowadzić pewne ulepszenia, ale to dobry sposób na rozpoczęcie. Ponadto łatwo jest stworzyć tę funkcjonalność bez rozszerzania obiektu Route. Zrobiłem to, ponieważ był to najwygodniejszy sposób na moją konfigurację.
Nie testowałem tego jeszcze w pełni, więc daj mi znać, jeśli coś pójdzie na południe.
AKTUALIZACJA 25.04.2013
Dokonałem pewnych zmian w funkcji, więc zamiast zwracać nazwę skrótu lub wywołania zwrotnego trasy, zwracam obiekt z fragmentem, parametrami i trasą, dzięki czemu można uzyskać dostęp do wszystkich danych z bieżącej trasy, podobnie jak w przypadku trasy- zdarzenie.
Możesz zobaczyć zmiany poniżej:
Zobacz poprzedni kod, aby uzyskać dalsze komentarze i wyjaśnienia, wyglądają one w większości tak samo.
źródło
_.find
funkcji jakothis
, eliminując tym samym potrzebęRouter
zmiennej (@DanAbramov już to zrobił).Marionette.AppRouter
przedłużyć swój router z funkcją powyżej, jednak substytutRouter.appRoutes
dlaRouter.routes
.Aby uzyskać trasę wywołującą (lub adres URL) z wywoływanej procedury obsługi trasy, możesz ją uzyskać, zaznaczając
Dotarłem tutaj w poszukiwaniu tej odpowiedzi, więc myślę, że powinienem zostawić to, co znalazłem.
źródło
Jeśli używasz ustawienia root dla routera, możesz je również dołączyć, aby uzyskać „prawdziwy” fragment.
źródło
Oto odrobinę bardziej rozwlekła (lub, w zależności od gustu, bardziej czytelna) wersja odpowiedzi Simona :
źródło
Jeśli spojrzysz na źródło
Router
, zobaczysz, że kiedy router wyzwala zdarzenie, mówiąc, że coś się zmienia, przekazuje mu nazwę jako „route: name”.http://documentcloud.github.com/backbone/docs/backbone.html#section-84
Zawsze możesz podpiąć zdarzenie „route” do routera i zapisać je w celu uzyskania aktualnej trasy.
źródło
route
zdarzenia, jeślitrigger
nie jesttrue
(zalecane i domyślne).