Яка різниця між маршрутом і ресурсом в API нового маршрутизатора?


114

Я намагаюся зрозуміти різницю між a Routeі a Resource. Те, як я розумію, Resourceдопомагає встановити піддослідження Routeоб'єкта до іншого RouteОб'єкту. Але незрозуміло, коли я думаю про відображення імен за замовчуванням, що відбувається і для шляхів.

Відповіді:


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створює абсолютно новий простір імен. Це означає, що отримані маршрути в цьому випадку будуть наступними. Як ви бачите Маршрут, Контролер та Перегляд ресурсу коментарів, не мають префіксу назви батьківського маршруту. Це означає, що вкладення ресурсу в інший ресурс скидає простір імен (= створює новий простір імен).

  • PostsRoute, PostsController, PostsView
  • PostsIndexRoute, PostsIndexController, PostsIndexView
  • PostsNewRoute, PostsNewController, PostsNewView
  • CommentsRoute, CommentsController, CommentsView
  • КоментаріNewRoute, CommentsNewController, CommentsNewView
  • AnotherRoute, AnotherController, AnotherView

Така поведінка пояснюється також у документах Ембер .


4
Це повинно бути зрозуміліше в Емберських посібниках. Я, звичайно, спочатку збентежив це поняття.
Габріель Г. Рой

Відмінна резюме чудового допису. Але остання цитата включити не має сенсу: That namespace will have an " which [...]. Що "означає? Це просто заповнювач для маршруту | Контролер | Переглянути?
Патрік М

Гей Патріку, дякую, що вказав на це. Я більше не міг зробити з цього підказки. Тому я додав більш складний приклад з вкладеними ресурсами. Я думаю, що це цитування стосувалося цього сценарію.
mavilein

Це набагато зрозуміліше. Дякую за додатковий приклад, mavilein.
Патрік М

Чи можете ви детальніше пояснити, у чому різниця (якщо така є) між вашим прикладом та цим:App.Router.map(function() { this.route("posts", { path: "/" }, function() { this.route("new"); this.route("comments"}, function() { this.route("new"); }); }); this.route("another", { path: "/another" }); });
Тимо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.