2013-04-30 34 views
6

Làm cách nào để đặt liên kết để định tuyến với phân khúc động. Theo hướng dẫn tôi bắt đầu với điều nàyLàm cách nào để đặt liên kết để định tuyến bằng phân đoạn động

window.App = Ember.Application.create() 
App.Router.map -> 
    @resource 'products' 
    @resource 'product', path: '/product/:product_id' 

trong mẫu của tôi:

{{#linkTo "product.1"}}products{{/linkTo}} 

Đáng tiếc là điều này mang lại cho tôi những lỗi follwing:

Uncaught Error: assertion failed: The attempt to linkTo route 'product.1' failed. 
The router did not find 'product.1' in its possible routes: 'products', 'product', 'index' 

Trả lời

10

{{linkTo}} hy vọng con đường được định nghĩa trong Router.map, vì vậy theo ánh xạ của bạn, nó chỉ đơn giản là product.

Đối với phân đoạn động, bạn cũng phải chuyển một đối tượng sẽ được tuần tự hóa trong ProductRoute. Việc tuần tự hóa trong hầu hết các kịch bản xảy ra mà không có nhà phát triển phải làm bất cứ điều gì vì Ember dựa vào các quy ước. Trong một số ít trường hợp, người ta phải thực hiện serialize một little differently, nhưng đối với hầu hết các trường hợp, bạn không phải chạm vào nó.

Nếu bạn đang sử dụng {{linkTo}} bên trong một vòng lặp {{each}} bạn có thể làm điều đó như thế này:

{{#each product in controller}} 
    {{#linkTo product product}}Details{{/linkTo}} 
{{/each}} 

hoặc

{{#each controller}} 
    {{#linkTo product this}}Details{{/linkTo}} 
{{/each}} 

Trường hợp số đầu tiên là tên tuyến đường và thứ hai là mô hình của bạn vật. Trong mã đầu tiên đối tượng cũng đã được đặt tên là product, trong khi trong lần thứ hai nó chỉ đơn giản là được chuyển thành this, là sản phẩm của sự lặp lại.

Nếu bạn có trường hợp bất thường nơi bạn phải liên kết đến tuyến động trong khi không sử dụng vòng {{each}}, bạn phải phơi bày đối tượng trong controller (ưa thích) hoặc view. Sau đó, bạn sẽ phải làm điều gì đó tương tự như sau:

App.SomeController = Em.Controller.extend 
    product: null 

App.SomeRoute = Em.Route.extend 
    ### 
    controller is actually `SomeController` here 
    model is not being used, and is null, while the actual model being 
    supplied to the controller is `product`, retrieved from store 
    ### 
    setupController: (controller, model) -> 
    product = App.Product.find 1 
    controller.set 'product', product 
    return 

Trong khi mẫu của bạn sẽ tương tự như sau:

{{#linkTo product controller.product}}Product{{/linkTo}} 

Làm thế nào để con đường biết id?

Conventions. Tuyến đường sẽ serialize đối tượng bạn vượt qua và hiển thị đối tượng với một thuộc tính duy nhất có tên của mô hình cho tuyến đường đó, sau đó là "_id", trong trường hợp này là product_id, vì vậy khi bạn nhấp vào liên kết đó, ứng dụng kích hoạt ProductRoute, chạy phương thức tuần tự tạo thuộc tính id đó, sau đó sẽ được sử dụng làm đối số của móc model. Đó là nơi bạn gọi số find chuyển số params.product_id làm đối số. Sau đó, mô hình trả về lời hứa của mô hình đó sẽ được sử dụng bởi setupController, phơi bày đối tượng với lớp xem là controller.content hoặc chỉ đơn giản là controller.

+0

Trong vòng lặp '# each' tôi phải báo giá' product': '{{#linkTo 'product' this}} Chi tiết {{/ linkTo}}'. –

Các vấn đề liên quan