web-dev-qa-db-fra.com

Quelle est la différence entre une route et une ressource dans la nouvelle API de routeur?

J'essaie de comprendre la différence entre un Route et un Resource. La façon dont je comprends Resource aide à définir les sous-chemins d'un objet Route vers un autre objet Route. Mais ce n'est pas clair quand je pense que le mappage de nom par défaut se produit également pour les chemins.

114
thecodejack

Veuillez noter qu'à partir du 1.11.0, this.route n'est utilisé qu'à la place de this.resource. Source: http://guides.emberjs.com/v1.11.0/routing/defining-your-routes/ *

Jetez un oeil à ce post pour une explication détaillée.

Ceci est un résumé approximatif de ce post (j'ai modifié un peu):

Depuis le changement de ressource et de route, beaucoup de gens sont confus quant à la signification des deux et comment ils affectent le nommage. Voici la différence:

  • ressource - une chose (un modèle)
  • route - quelque chose à voir avec la chose

Cela signifie donc qu'un routeur utilisant une route et une ressource pourrait ressembler à ceci:

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

Cela entraînerait la création/utilisation des itinéraires suivants:

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

Comme nous le voyons dans cet exemple, la ressource affecte la dénomination des contrôleurs, des routes et des vues utilisées/créées (la "nouvelle" route est traitée comme subordonnée à la ressource "publications"). Citez la source originale (je l'ai modifiée, car c'était irritant comme Patrick M l'a correctement souligné dans les commentaires):

Cela signifie que chaque fois que vous créez une ressource, elle crée un tout nouvel espace de noms. Cet espace de noms est nommé d'après la ressource et tous les itinéraires enfants y seront insérés.

Mise à jour: exemple plus complexe avec des ressources imbriquées

Prenons l'exemple plus complexe suivant avec plusieurs ressources imbriquées:

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

Dans ce cas, la ressource comments crée un tout nouvel espace de noms. Cela signifie que les itinéraires résultants dans ce cas seront les suivants. Comme vous pouvez le voir, la route, le contrôleur et la vue pour la ressource de commentaires ne sont pas préfixés par le nom de la route parent. Cela signifie que l'imbrication d'une ressource dans une autre la ressource réinitialise l'espace de noms (= crée un nouvel espace de noms).

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

Ce comportement est également expliqué dans Ember Docs .

102
mavilein