В чем разница между маршрутом и ресурсом в New Router API?

114

Я пытаюсь понять разницу между a Routeи a Resource. То, как я понимаю, Resourceпомогает установить подпути одного Routeобъекта к другому Routeобъекту. Но неясно, когда я думаю о сопоставлении имен по умолчанию, которое происходит и для путей.

thecodejack
источник

Ответы:

101

Обратите внимание, что начиная с 1.11.0 и далее this.routeиспользуется только вместо this.resource. Источник: http://guides.emberjs.com/v1.11.0/routing/defining-your-routes/ *

Посмотрите этот пост для подробного объяснения.

Это приблизительное резюме этого сообщения (я немного изменил):

С момента изменения ресурса и маршрута многие люди не понимают их значения и то, как они влияют на именование. Вот в чем разница:

  • ресурс - вещь (модель)
  • маршрут - что-то делать с вещью

Это означает, что маршрутизатор, использующий маршрут и ресурс, может выглядеть так:

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

Это приведет к созданию / использованию следующих маршрутов:

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

Как мы видим из этого примера, ресурс влияет на именование используемых / создаваемых контроллеров, маршрутов и представлений («новый» маршрут рассматривается как подчиненный ресурсу «сообщений»). Цитируйте из первоисточника (я изменил его, потому что это раздражало, как правильно указал Патрик М. в комментариях):

Это означает, что всякий раз, когда вы создаете ресурс, он будет создавать совершенно новое пространство имен. Это пространство имен названо в честь ресурса, и все дочерние маршруты будут вставлены в него.

Обновление: более сложный пример с вложенными ресурсами

Рассмотрим следующий более сложный пример с несколькими вложенными ресурсами:

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

В этом случае ресурс commentsсоздает совершенно новое пространство имен. Это означает, что результирующие маршруты в этом случае будут следующими. Как видите, Route, Controller и View для ресурса комментариев не имеют префикса с именем родительского маршрута. Это означает, что вложение ресурса в другой ресурс сбрасывает пространство имен (= создает новое пространство имен).

  • PostsRoute, PostsController, PostsView
  • PostsIndexRoute, PostsIndexController, PostsIndexView
  • PostsNewRoute, PostsNewController, PostsNewView
  • КомментарииRoute, CommentsController, CommentsView
  • КомментарииNewRoute, КомментарииNewController, КомментарииNewView
  • AnotherRoute, AnotherController, AnotherView

Это поведение также объясняется в Ember Docs .

mavilein
источник
4
Это должно быть яснее в руководствах Ember. Поначалу меня определенно смутила эта концепция.
Габриэль Дж. Рой
Отличное резюме отличного поста. Но последняя цитата включить не имеет смысла: That namespace will have an " which [...]. Что "значит? Это просто заполнитель для Route | Контроллер | Посмотреть?
Patrick M
Привет, Патрик, спасибо, что указал на это. Я больше не мог понять этого. Поэтому я добавил более сложный пример с вложенными ресурсами. Я думаю, что эта цитата относится к этому сценарию.
mavilein
Это намного яснее. Спасибо за дополнительный пример, mavilein.
Patrick M
Можете ли вы уточнить, в чем разница (если есть) между вашим примером и этим:App.Router.map(function() { this.route("posts", { path: "/" }, function() { this.route("new"); this.route("comments"}, function() { this.route("new"); }); }); this.route("another", { path: "/another" }); });
Тимо