Jaka jest różnica między trasą a zasobem w nowym interfejsie API routera?

114

Próbuję zrozumieć różnicę między a Routei a Resource. Sposób, w jaki rozumiem, Resourcepomaga ustawić ścieżki podrzędne Routeobiektu do innego Routeobiektu. Ale jest niejasne, kiedy myślę o domyślnym mapowaniu nazw również dla ścieżek.

thecodejack
źródło

Odpowiedzi:

101

Należy pamiętać, że od wersji 1.11.0 this.routejest używany tylko zamiast this.resource. Źródło: http://guides.emberjs.com/v1.11.0/routing/defining-your-routes/ *

Spójrz na ten post, aby uzyskać szczegółowe wyjaśnienie.

To jest przybliżone podsumowanie tego postu (trochę zmodyfikowałem):

Od czasu zmiany zasobu i trasy wielu ludzi jest zdezorientowanych co do znaczenia tych dwóch elementów i ich wpływu na nazewnictwo. Oto różnica:

  • zasób - rzecz (model)
  • trasa - coś związanego z tą rzeczą

Oznacza to, że router korzystający z trasy i zasobu może wyglądać następująco:

App.Router.map(function() {
  this.resource("posts", { path: "/" }, function() {
    this.route("new", { path: "/new" });
  });
  this.route("another", { path: "/another" });
});

Spowodowałoby to utworzenie / użycie następujących tras:

  • PostsRoute, PostsController, PostsView
  • PostsIndexRoute, PostsIndexController, PostsIndexView
  • PostsNewRoute, PostsNewController, PostsNewView
  • AnotherRoute, AnotherController, AnotherView

Jak widać na tym przykładzie, zasób wpływa na nazewnictwo używanych / tworzonych kontrolerów, tras i widoków (trasa „nowa” jest traktowana jako podrzędna wobec zasobu „posty”). Cytuj z oryginalnego źródła (zmodyfikowałem je, ponieważ było irytujące, jak słusznie wskazał Patrick M w komentarzach):

Oznacza to, że za każdym razem, gdy tworzysz zasób, utworzy on zupełnie nową przestrzeń nazw. Ta przestrzeń nazw nosi nazwę zasobu i wszystkie trasy podrzędne zostaną do niej wstawione.

Aktualizacja: bardziej złożony przykład z zagnieżdżonymi zasobami

Rozważmy następujący bardziej złożony przykład z wieloma zagnieżdżonymi zasobami:

App.Router.map(function() {
  this.resource("posts", { path: "/" }, function() {
    this.route("new", { path: "/new" });
    this.resource("comments", { path: "/comments" }, function() {
      this.route("new", { path: "/new" });
    });
  });
  this.route("another", { path: "/another" });
});

W tym przypadku zasób commentstworzy zupełnie nową przestrzeń nazw. Oznacza to, że otrzymane trasy w tym przypadku będą następujące. Jak widać, trasa, kontroler i widok zasobu komentarzy nie są poprzedzone nazwą trasy nadrzędnej. Oznacza to, że zagnieżdżenie zasobu w innym zasobie resetuje przestrzeń nazw (= tworzy nową przestrzeń nazw).

  • PostsRoute, PostsController, PostsView
  • PostsIndexRoute, PostsIndexController, PostsIndexView
  • PostsNewRoute, PostsNewController, PostsNewView
  • CommentsRoute, CommentsController, CommentsView
  • CommentsNewRoute, CommentsNewController, CommentsNewView
  • AnotherRoute, AnotherController, AnotherView

To zachowanie jest również wyjaśnione w dokumentach Ember .

mavilein
źródło
4
Powinno to być wyraźniejsze w przewodnikach Ember. Na początku byłem z pewnością zdezorientowany tą koncepcją.
Gabriel G. Roy
Doskonałe podsumowanie świetnego postu. Ale ostatni cytat ty to nie ma sensu: That namespace will have an " which [...]. Co to "oznacza? Czy to tylko symbol zastępczy dla Route | Kontroler | Widok?
Patrick M
Hej Patrick, dzięki za wskazanie tego. Nie mogłem już nic z tego wyciągnąć. Dlatego dodałem bardziej złożony przykład z zagnieżdżonymi zasobami. Myślę, że ten cytat odnosi się do tego scenariusza.
mavilein
To jest o wiele jaśniejsze. Dzięki za dodatkowy przykład, mavilein.
Patrick M
Czy możesz wyjaśnić, jaka jest różnica (jeśli w ogóle) między twoim przykładem a tym:App.Router.map(function() { this.route("posts", { path: "/" }, function() { this.route("new"); this.route("comments"}, function() { this.route("new"); }); }); this.route("another", { path: "/another" }); });
Timo