新路由器API中的路由和资源有什么区别?


114

我试图了解a Route和a 之间的区别Resource。我了解的方式Resource有助于将一个Route对象的子路径设置为另一个Route对象。但是,当我想到默认名称映射也发生在路径上时,还不清楚。

Answers:


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

这将导致以下路由的创建/使用:

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

从该示例中我们可以看到,资源影响了正在使用/创建的Controllers,Routes和Views的命名(“ new”路由被视为从属于“ posts”资源)。从原始来源中引用(我修改了它,因为Patrick 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创建一个全新的名称空间。这意味着在这种情况下生成的路由如下。如您所见,注释资源的Route,Controller和View没有前缀父路由的名称。这意味着将资源嵌套在另一个资源中会重置名称空间(=创建新的名称空间)。

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

Ember Docs中也对此行为进行了解释。


4
在Ember指南中应该更加清楚。首先,我当然对这个概念感到困惑。
加百利·罗伊

优秀文章的出色总结。但是您最后加上的报价没有意义:That namespace will have an " which [...]。什么"意思 它只是Route的占位符| 控制器| 视图?
Patrick M

嘿帕特里克,谢谢你指出这一点。我再也找不到线索了。因此,我添加了带有嵌套资源的更复杂的示例。我认为这种引用是指这种情况。
mavilein 2014年

那更清楚了。感谢您的附加示例,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" }); });
Timo 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.