2013-04-30 6 views
6

Come posso impostare un collegamento per instradare con un segmento dinamico. Secondo guidare parto da questoCome posso impostare un collegamento per instradare con un segmento dinamico

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

nel mio modello:

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

Purtroppo questo mi dà l'errore 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' 

risposta

10

{{linkTo}} aspetta il percorso definito nel Router.map, così in base alla tua mappatura dovrebbe essere semplicemente product.

Per quanto riguarda il segmento dinamico, è necessario passare anche un oggetto che verrà serializzato nello ProductRoute. La serializzazione in quasi tutti gli scenari si verifica senza che lo sviluppatore debba fare nulla poiché Ember fa affidamento sulle convenzioni. In rari casi, è necessario implementare serialize a little differently, ma per la maggior parte dei casi non è necessario toccarlo.

Se stai usando {{linkTo}} all'interno di un ciclo {{each}} si può fare in questo modo:

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

o

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

Dove il primo argomento è il nome della rotta e il secondo è il tuo modello oggetto. Nel primo codice l'oggetto è stato anche chiamato come product, mentre nel secondo è semplicemente passato come this, che è il prodotto dell'iterazione.

Se si dispone di uno scenario insolito in cui devi creare un collegamento a un percorso dinamico, pur non utilizzando il ciclo {{each}}, è necessario esporre l'oggetto nel controller (preferito) o view. Allora dovreste fare qualcosa di simile al seguente:

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 

Mentre il modello sarebbe simile a questa:

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

Come si fa il percorso conosce l'ID?

Conventions. Il percorso sarà serialize l'oggetto che si passa ed esporre un oggetto con una singola proprietà, che ha il nome del modello per quella route, seguito da "_id", che in questo caso sarebbe product_id, quindi quando si fa clic su quel collegamento, l'app attiva lo ProductRoute, esegue il metodo serialize creando tale proprietà id, che verrà successivamente utilizzata come argomento dell'aggancio model. È qui che si chiama find passando params.product_id come argomento. Quindi il modello restituisce una promessa del modello che verrà utilizzato dallo setupController, esponendo l'oggetto al livello di vista come controller.content o semplicemente controller.

+0

Nel ciclo '# each' ho dovuto citare' product': '{{#linkTo 'product' this}} Dettagli {{/ linkTo}}'. –