2016-02-03 10 views
5

Sto seguendo i documenti per Ember 2.3 e non riesco a trovare da nessuna parte qualcosa di molto semplice: come si accede a un valore fornito dal gancio del modello della rotta all'interno del modello principale: application.hbs?Come accedere ai dati dalle rotte in un modello di applicazione Ember?

percorsi/Client.js

// ... 
export default Ember.Route.extend({ 
    model() { 
     return { 
      navigation: [ 
       { 
        title: "Projects", 
        link: "projects" 
       }, 
       { 
        title: "My Specifications", 
        link: "specs" 
       } 
      ] 
     } 
    } 
}); 

templates/application.hbs

<nav> 
    {{#each navigation as |navItem|}} 
     <li>{{#link-to navItem.link}} {{navItem.title}} {{/link-to}}</li> 
    {{/each}} 
</nav> 
{{outlet}} 

Come è ora, l'oggetto di navigazione è accessibile al modello del percorso (client.hbs) ma non al modello dell'applicazione.

+1

Prima di tutto è necessario refferare i dati del modello utilizzando {{#each model.navigation ...}} nel modello. In secondo luogo, ogni percorso corrisponde al suo modello. Nel tuo caso hai bisogno di un percorso di applicazione per visualizzare i dati dal modello nell'applicazione hbs. –

+0

Questo è esattamente ciò a cui non sono interessato, @kristjan. Ho una (molto comune) situazione in cui ho bisogno di un percorso normale per fornire dati a cui accedere nel modello principale (application.hbs). Ad esempio l'elenco di navigazione attiva. – Slavic

+0

@Slavic Ogni modello che ha il proprio percorso è il modo ember. Convenzione sulla configurazione, ma se si desidera visualizzare il modello di navigazione nel percorso dell'applicazione perché non restituire più modelli per il percorso dell'applicazione? – Craicerjack

risposta

3

Ecco come si fa (a meno che non brace si presenta con un modo migliore nelle versioni future):

percorsi/Client.js

// ... 
export default Ember.Route.extend({ 
    setupController() { 
     this.controllerFor('application').set('navigation', ["nav1", "nav2"]); 
    } 
}); 

Grazie, Ivan, per la risposta!

+0

Il focus non era il posto giusto per il controller Per il metodo, ma, sì - sono d'accordo che questo non è il posto migliore – Slavic

2

Come fa un accesso un valore fornito dal gancio del modello del percorso all'interno del template principale

Per impostazione predefinita, all'interno del gancio setupController del percorso, Ember sarà set the property model on your controller al valore risolto della promessa restituita dal gancio model del percorso.

Significato si può semplicemente utilizzare la proprietà model nel modello per accedere model.navigation:

<nav> 
    {{#each model.navigation as |navItem|}} 
     <li>{{#link-to navItem.link}} {{navItem.title}} {{/link-to}}</li> 
    {{/each}} 
</nav> 

Se si desidera utilizzare un nome diverso, è possibile ignorare il gancio setupController e impostare il nome da soli:

export default Ember.Route.extend({ 
    // ... 
    setupController(controller, model) { 
    this.set('navigation', Ember.get(model, 'navigation')); 
    } 
    // ... rest of the code 
}) 

Ciò significa che ora è possibile utilizzare navigation anziché model.navigation all'interno del modello. Un altro modo potrebbe essere quello di aggiungere un alias all'interno del vostro controller per la proprietà model:

export default Ember.Controller.extend({ 
    navigation: Ember.computed.alias('model.navigation') 
    // ... rest of the code 
}) 

che vi permetterà così di utilizzare navigation invece di model.navigation.

Tuttavia, se si desidera avere una sorta di navigazione globale nell'applicazione, il modo migliore sarebbe utilizzare uno Service che si dovrebbe iniettare in qualsiasi controller che necessita di navigazione. Qualcosa di simile:

// app/services/navigation.js 
export default Ember.Service.extend({ 
    items: null, 

    init() { 
    this._super(...arguments); 
    this.set('items', [{ 
     title: "Projects", 
     link: "projects" 
    }, { 
     title: "My Specifications", 
     link: "specs" 
    }]); 
    } 
}); 

E poi iniettare nel vostro controller:

export default Ember.Controller.extend({ 
    navigation: Ember.service.inject() 
}); 

E ora si ha accesso alla navigazione nel modello che del controllore pure.

+0

Non ero interessato ad accedere ai dati usando un altro nome. Per me model.navigation è perfettamente a posto. Il compito era quello di ottenere semplicemente i dati. – Slavic

+0

@Slavic ok, vedo come ho capito male, ho corretto la mia risposta. Ho anche aggiunto un suggerimento su come implementare più navigazione globale, se necessario. – nem035

+0

Purtroppo, un servizio non sembra affrontare il problema in questione. Deriva dal fatto che ogni controller avrà la sua voce in merito alla navigazione (ad esempio per contrassegnare un oggetto di navigazione come attivo, ma non solo questo). In questo momento mi sto appoggiando alla soluzione setupController, e anche se non so ancora se risolverà tutti i miei problemi di navigazione, è certamente una soluzione a ciò che è stato chiesto, in particolare. Hai il mio upvote. – Slavic

0

Vorrei risolvere il problema in questo modo. Crea un componente di navigazione che accetta parametri personalizzati.

Modelli application.hbs

Ora nel tuo Client.js

apiURL: 'navigations/client' 

E il componente personalizzato personalizzati-Navigation.js

resolvedRouteNavs: function() { 
    return DS.PromiseArray.create({ 
      promise: store.query(this.get('url'), { user? : userID?? }); 
    }) 
}.property('apiURL') 

E custom-navigation.hbs.

{{#each resolvedRouteNavs as |navItem|}} 
    {{navItem.name}} 
{{/each}} 

Se hai a che fare con le matrici statiche come navigazioni

allora non è necessario risolvere e sarebbe semplicemente quello di mettere fuori la matrice binded, che è diversa per ogni percorso.

Client.js

navs: [{ name: '1', route: 'foo'}, { name: '2', route: 'bar' }] 

alcuni-diversi-place.js

navs: [{ name: 'blah', route: 'foo.bar'}, { name: 'meh', route: 'bar.foo' }] 

e davvero gancio modello dovrebbero contenere dati che vengono recuperati dal server. Altrimenti usa il comando setupController.

setupController: function(controller, model) { 
     this._super(controller, model); 

     controller.setProperties({ 
      nav: [] 
     });