Was ist der Unterschied zwischen einer Route und einer Ressource in der New Router API?


114

Ich versuche den Unterschied zwischen a Routeund a zu verstehen Resource. Die Art und Weise, wie ich es verstehe, Resourcehilft dabei, Unterpfade eines RouteObjekts auf ein anderes RouteObjekt zu setzen. Aber es ist unklar, wenn ich daran denke, dass die Standard-Namenszuordnung auch für Pfade stattfindet.

Antworten:


101

Bitte beachten Sie, dass ab 1.11.0 this.routenur noch anstelle von verwendet wird this.resource. Quelle: http://guides.emberjs.com/v1.11.0/routing/defining-your-routes/ *

In diesem Beitrag finden Sie eine ausführliche Erklärung.

Dies ist eine grobe Zusammenfassung dieses Beitrags (ich habe ein wenig geändert):

Seit dem Wechsel zu Ressource und Route sind viele Menschen verwirrt über die Bedeutung der beiden und wie sie sich auf die Benennung auswirken. Hier ist der Unterschied:

  • Ressource - eine Sache (ein Modell)
  • Route - etwas mit der Sache zu tun

Dies bedeutet, dass ein Router, der eine Route und eine Ressource verwendet, möglicherweise folgendermaßen aussieht:

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

Dies würde dazu führen, dass die folgenden Routen erstellt / verwendet werden:

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

Wie aus diesem Beispiel hervorgeht, wirkt sich die Ressource auf die Benennung der verwendeten / erstellten Controller, Routen und Ansichten aus (Die "neue" Route wird der Ressource "Beiträge" untergeordnet behandelt). Zitieren Sie aus der Originalquelle (ich habe es geändert, weil es irritierend war, wie Patrick M in den Kommentaren richtig hervorhob):

Dies bedeutet, dass beim Erstellen einer Ressource ein brandneuer Namespace erstellt wird. Dieser Namespace ist nach der Ressource benannt und alle untergeordneten Routen werden in sie eingefügt.

Update: komplexeres Beispiel mit verschachtelten Ressourcen

Betrachten Sie das folgende komplexere Beispiel mit mehreren verschachtelten Ressourcen:

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" });
});

In diesem Fall erstellt die Ressource commentseinen brandneuen Namespace. Dies bedeutet, dass die resultierenden Routen in diesem Fall die folgenden sind. Wie Sie sehen können, wird der Route, dem Controller und der Ansicht für die Kommentarressource nicht der Name der übergeordneten Route vorangestellt. Das bedeutet, dass das Verschachteln einer Ressource in einer anderen Ressource den Namespace zurücksetzt (= einen neuen Namespace erstellt).

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

Dieses Verhalten wird auch in den Ember Docs erläutert .


4
Dies sollte in den Ember-Handbüchern klarer sein. Dieses Konzept hat mich zunächst sicherlich verwirrt.
Gabriel G. Roy

Hervorragende Zusammenfassung eines ausgezeichneten Beitrags. Das letzte Zitat, das Sie einfügen, macht jedoch keinen Sinn : That namespace will have an " which [...]. Was bedeutet das "? Ist es nur ein Platzhalter für Route | Controller | Aussicht?
Patrick M

Hey Patrick, danke, dass du darauf hingewiesen hast. Ich konnte keinen Hinweis mehr darauf machen. Daher habe ich ein komplexeres Beispiel mit verschachtelten Ressourcen hinzugefügt. Ich denke, dieses Zitat bezog sich auf dieses Szenario.
Mavilein

Das ist viel klarer. Danke für das zusätzliche Beispiel, Mavilein.
Patrick M

Können Sie näher erläutern, was der Unterschied (falls vorhanden) zwischen Ihrem Beispiel und diesem ist: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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.