New Router APIのルートとリソースの違いは何ですか?


114

との違いを理解しようRouteとしていResourceます。私が理解している方法Resourceは、Routeオブジェクトのサブパスを別のRouteオブジェクトに設定するのに役立ちます。しかし、パスに対してもデフォルトの名前マッピングが発生していると考えると、不明確です。

回答:


101

1.11.0以降でthis.routeは、の代わりにのみ使用されることに注意してくださいthis.resource。出典:http : //guides.emberjs.com/v1.11.0/routing/defining-your-routes/ *

詳細な説明については、この投稿をご覧ください。

これはこの投稿の大まかな要約です(私は少し変更しました):

リソースとルートへの変更以来、多くの人が2つの意味とそれらがネーミングにどのように影響するかについて混乱しています。ここに違いがあります:

  • リソース-モノ(モデル)
  • ルート-事に関係する何か

つまり、ルートとリソースを使用するルーターは次のようになります。

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

これにより、次のルートが作成/使用されます。

  • PostsRou​​te、PostsController、PostsView
  • PostsIndexRoute、PostsIndexController、PostsIndexView
  • PostsNewRoute、PostsNewController、PostsNewView
  • AnotherRoute、AnotherController、AnotherView

この例からわかるように、リソースは、使用/作成されているコントローラー、ルート、およびビューの命名に影響します(「新しい」ルートは「投稿」リソースの下位として扱われます)。元のソースからの引用(パトリックMがコメントで正しく指摘したのでイライラしていたので、変更しました):

つまり、リソースを作成するたびに、新しい名前空間が作成されます。その名前空間はリソースにちなんで名付けられ、すべての子ルートがそれに挿入されます。

更新:ネストされたリソースを持つより複雑な例

複数のネストされたリソースを持つ次のより複雑な例を考えてみます。

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は新しい名前空間を作成します。つまり、この場合のルートは次のようになります。ご覧のとおり、コメントリソースのルート、コントローラー、ビューには、親ルートの名前がプレフィックスとして付けられていません。つまり、リソースを別のリソース内にネストすると、ネームスペースがリセットされます(=新しいネームスペースが作成されます)。

  • PostsRou​​te、PostsController、PostsView
  • PostsIndexRoute、PostsIndexController、PostsIndexView
  • PostsNewRoute、PostsNewController、PostsNewView
  • CommentsRou​​te、CommentsController、CommentsView
  • CommentsNewRoute、CommentsNewController、CommentsNewView
  • AnotherRoute、AnotherController、AnotherView

この動作はEmber Docsでも説明されています。


4
これは、エンバーガイドでより明確になるはずです。最初は確かにこのコンセプトに戸惑いました。
ガブリエルG.ロイ

優れた投稿の優れた要約。しかし、あなたが含める最後の引用は意味がありません:That namespace will have an " which [...]。どういう"意味ですか?Routeのプレースホルダーですか?コントローラー| 見る?
Patrick M

ちょっとパトリック、指摘してくれてありがとう。もう手がかりはありません。したがって、ネストされたリソースを持つより複雑な例を追加しました。この引用はこのシナリオに言及していると思います。
mavilein 2014年

それははるかに明確です。追加の例、マビレインをありがとう。
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" }); });
Timo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.