Sự khác biệt giữa tuyến và tài nguyên trong API bộ định tuyến mới là gì?


114

Tôi đang cố gắng hiểu sự khác biệt giữa a Routevà a Resource. Cách tôi hiểu Resourcesẽ giúp thiết lập các đường dẫn con của một Routeđối tượng đến một RouteĐối tượng khác . Nhưng nó không rõ ràng khi tôi nghĩ về ánh xạ tên mặc định cũng xảy ra cho các đường dẫn.

Câu trả lời:


101

Xin lưu ý rằng từ 1.11.0 trở đi, this.routechỉ được sử dụng thay vì this.resource. Nguồn: http://guides.emberjs.com/v1.11.0/routing/defining-your-routes/ *

Hãy xem bài đăng này để được giải thích chi tiết.

Đây là bản tóm tắt sơ bộ của bài đăng này (tôi đã sửa đổi một chút):

Kể từ khi thay đổi tài nguyên và tuyến đường, rất nhiều người đã nhầm lẫn về ý nghĩa của cả hai và cách chúng ảnh hưởng đến việc đặt tên. Đây là sự khác biệt:

  • tài nguyên - một thứ (một mô hình)
  • tuyến đường - điều gì đó để làm với điều

Vì vậy, điều này có nghĩa là một bộ định tuyến sử dụng một tuyến đường và tài nguyên có thể trông giống như sau:

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

Điều này sẽ dẫn đến các tuyến sau được tạo / sử dụng:

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

Như chúng ta thấy từ ví dụ này, tài nguyên ảnh hưởng đến việc đặt tên cho Bộ điều khiển, Đường dẫn và Chế độ xem đang được sử dụng / tạo (Tuyến đường "mới" được coi là cấp dưới của tài nguyên "bài viết"). Trích dẫn từ nguồn gốc (tôi đã sửa đổi nó, vì nó gây khó chịu như Patrick M đã chỉ ra một cách chính xác trong các nhận xét):

Điều này có nghĩa là bất cứ khi nào bạn tạo một tài nguyên, nó sẽ tạo ra một không gian tên hoàn toàn mới. Không gian tên đó được đặt tên theo tài nguyên và tất cả các tuyến con sẽ được chèn vào đó.

Cập nhật: ví dụ phức tạp hơn với các tài nguyên lồng nhau

Hãy xem xét ví dụ phức tạp hơn sau với nhiều tài nguyên lồng nhau:

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

Trong trường hợp này, tài nguyên commentstạo ra một không gian tên hoàn toàn mới. Điều này có nghĩa là các tuyến đường kết quả trong trường hợp này sẽ như sau. Như bạn có thể thấy Tuyến, Bộ điều khiển và Chế độ xem cho tài nguyên nhận xét không có tiền tố là tên của tuyến mẹ. Điều đó có nghĩa là lồng một tài nguyên trong một tài nguyên khác sẽ đặt lại không gian tên (= tạo một không gian tên mới).

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

Hành vi này cũng được giải thích trong Tài liệu Ember .


4
Điều này sẽ rõ ràng hơn trong các hướng dẫn Ember. Tôi chắc chắn đã bị nhầm lẫn bởi khái niệm này lúc đầu.
Gabriel G. Roy

Tóm tắt xuất sắc của một bài đăng xuất sắc. Nhưng báo giá cuối cùng bạn bao gồm không có ý nghĩa: That namespace will have an " which [...]. Nghĩa "là gì? Nó chỉ là một trình giữ chỗ cho Tuyến đường | Bộ điều khiển | Lượt xem?
Patrick M

Này Patrick, cảm ơn vì đã chỉ ra điều đó. Tôi không thể tìm ra manh mối của nó nữa. Do đó tôi đã thêm ví dụ phức tạp hơn với các tài nguyên lồng nhau. Tôi nghĩ rằng trích dẫn này đề cập đến kịch bản này.
mavilein

Điều đó rõ ràng hơn nhiều. Cảm ơn về ví dụ bổ sung, mavilein.
Patrick M

Bạn có thể xây dựng trên là những gì chênh lệch (nếu có) giữa dụ bạn và điều này: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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.