2013-02-17 33 views
6

Tôi có hai nguồn lực mà cả hai đều có cùng một tiểu tài nguyên:Tôi làm cách nào để phân biệt các tuyến đường lồng nhau trong ember.js?

App.Router.map(function() { 
    this.resource('post', function() { 
    this.resource('comments', function() { 
     this.route('new'); 
    }); 
    }); 

    this.resource('product', function() { 
    this.resource('comments', function() { 
     this.route('new'); 
    }); 
    }); 
}); 

Vấn đề là các bộ định tuyến ember xây dựng những cái tên của các đối tượng đường ra khỏi chỉ các tuyến đường hiện tại và cha mẹ, không ra khỏi toàn bộ hệ thống cấp bậc. Do đó, nó cố định tuyến cả /posts/:id/comments/new/products/:id/comments/new đến đối tượng App.NewCommentRoute. Tôi có thể làm gì để sữa nó?

Bài đăng này đã được điều chỉnh từ GitHub issue.

+0

này ban đầu được câu hỏi của tôi: https://github.com/emberjs/ember.js/issues/2086 Cảm thấy một chút giống như đại diện của tôi đã được rim. – KOGI

+0

Xin lỗi về điều đó. Tôi không thấy nó. Tôi sẽ đánh dấu câu trả lời của tôi là wiki cộng đồng. (Câu hỏi không thể được, mặc dù tôi đã liên kết đến vấn đề GitHub của bạn trong văn bản câu hỏi.) –

+0

Cảm ơn. Câu trả lời của bạn là tất cả của bạn, mặc dù, vì vậy bạn nên nhận được tất cả các đại diện cho nó. Chỉ có câu hỏi ban đầu là của tôi. – KOGI

Trả lời

6

Tôi lấy giải pháp của James A. Rosen thêm một bước nữa và nó hoạt động như một sự quyến rũ. Một chút dư thừa, nhưng làm cho mọi thứ trực quan hơn nhiều xuống đường:

App.Router.map(function() { 
    this.resource('post', function() { 
    this.resource('post.comments', { path: '/comments' }, function() { 
     this.route('new'); 
    }); 
    }); 

    this.resource('product', function() { 
    this.resource('product.comments', { path: '/comments' }, function() { 
     this.route('new'); 
    }); 
    }); 
}); 

này bây giờ cho phép bạn sử dụng transitionTo('product.comments.new') hoặc App.register('route:product.comments.new', myRouteHandler) cũng giống như dự kiến ​​ban đầu.

Nếu bạn không tự đăng ký xử lý tuyến đường của bạn, Ember, duyên dáng, sẽ thậm chí tìm kiếm nó trong App.ProductCommentsNewRoute

Nhược điểm duy nhất là khả năng dự phòng xác định tên của sub-tài nguyên với tên cùng một gốc tài nguyên chính đã có.

4

Khi bạn chỉ định tuyến đường, đường dẫn mặc định là tên của tuyến đường, nhưng bạn có thể ghi đè hành vi đó. Bạn có thể định hướng các tuyến đường lồng nhau bằng cách thêm nhiều thông tin hơn vào tên. Có hai cách để đạt được cơ bản các kết quả tương tự:

App.Router.map(function() { 
    this.resource('post', function() { 
    this.resource('postComments', { path: '/comments' }, function() { 
     this.route('new'); 
    }); 
    }); 

    this.resource('product', function() { 
    this.resource('productComments', { path: '/comments' }, function() { 
     this.route('new'); 
    }); 
    }); 
}); 
App.Router.map(function() { 
    this.resource('post', function() { 
    this.resource('comments', function() { 
     this.route('newPost', { path: '/new' }); 
    }); 
    }); 

    this.resource('product', function() { 
    this.resource('comments', function() { 
     this.route('newPost', { path: '/new' }); 
    }); 
    }); 
}); 

Trong cả hai trường hợp, nay là router sẽ tìm kiếm App.NewPostCommentsPathApp.NewProductCommentsPath. Lợi thế của lần đầu tiên trong phần thứ hai là nếu bạn muốn tham chiếu đến các tuyến đường bên ngoài, chúng trông giống như "postComments.new" thay vì "comments.newPost". Cựu người đọc tốt hơn cho tôi.

+0

+1 Cảm ơn vì điều này. Đây là giải pháp hiệu quả. Mặc dù, như đã đề cập trong chuỗi ban đầu trên GitHub, nó không thực sự là một giải pháp thích hợp mà nhóm Ember phải hài lòng. – KOGI

1

Đã hai năm trôi qua, Ember đã cải thiện rất nhiều.

Vì Ember 1.7, các tuyến đường cũng có thể có các chương trình con: http://emberjs.com/blog/2014/08/23/ember-1-7-0-released.html#toc_new-features.

Vì vậy, chúng ta có thể viết lại này như:

this.route('post', function() { 
    this.route('comments', { path: '/comments' }, function() { 
     this.route('new'); 
    }); 
}); 

this.route('product', function() { 
    this.route('comments', { path: '/comments' }, function() { 
     this.route('new'); 
    }); 
}); 
Các vấn đề liên quan