2013-01-06 16 views
10

il mio modello di indice ha due uscite, una per l'intestazione, un'altra per il contenuto. il modello reso nel contenuto cambia a seconda del contenuto visualizzato.Come eseguire il rendering di più modelli per un instradamento in Router v2

Nel vecchio router, è possibile eseguire questa operazione chiamando lo connectOutlet su diversi controller che possedevano quel modello. Non riesco a capire come fare lo stesso nel nuovo router.

qualche suggerimento?

risposta

18

con la mia ricerca, sono arrivato a questo: Diciamo che avete un router definito come questo :

App.Router.map(function(match) { 
    match('/').to('index'); 
}); 

ApplicationTemplate:

<script type="text/x-handlebars"> 
{{outlet header}} 
{{outlet}} 
</script> 

IndexTemplate:

<script type="text/x-handlebars" data-template-name="index"> 
{{outlet dashboard}} 
{{outlet spaces}} 
</script> 

Ora, Quello che vogliamo è che quando l'utente va al router indice, la pagina dovrebbe:

  • Render indice in uscita principale e intestazione nella presa di intestazione di applicazione modello.
  • dashboard di rendering, modello di spazi nel modello di indice.

Per raggiungere questo obiettivo, scriviamo il seguente codice nel indexRoute

App.IndexRoute = Em.Route.extend({ 
    renderTemplate: function(controller, model){ 
     //Render header into header outlet 
     this.render('header',{ 
      outlet:'header' 
     }); 
     //Render index into main outlet. If you comment out 
     //this line, the code below fails 
     this.render('index'); 

     //by using into, we can render into the index template 
     //Note: The controller is optional.if not specified, 
     //ember picks up controller for the given template. 
     this.render('dashboard',{ 
      outlet:'dashboard', 
      into:'index', 
      controller:this.controllerFor('somethingElse', App.TestModel.find()) 
     }); 
     //controller is SpacesController 
     this.render('spaces',{ 
      outlet:'spaces', 
      into:'index' 
     }); 
    } 
}); 
+1

Abbastanza simile alla mia risposta originale eh? –

+0

Il mio primo pensiero è stato quello di chiederti di aggiornare le tue funzioni in conformità con ember-latest, in modo da poter accettare la tua risposta. Tuttavia, volevo davvero che ci fosse this.render ('index') e successivi rendering in esso. Il tuo codice viene visualizzato solo nel modello dell'applicazione. Questo, combinato con il modo corretto di assegnare 'content' di controller, mi ha portato a scrivere una nuova risposta – adivis

+0

Perché entrambi i modelli hanno il nome 'index', cioè il valore di attributo' data-template-name' 'index'? – Ygg

11

è possibile utilizzare la funzione di renderTemplates nel router di rendere viste mulitple alle prese nome:

renderTemplates:function() { 
    this.render('todos_list', { 
     into:'todos', //template name 
     outlet: 'todos', //named outlet 
     controller: 'listController' //controller you want to use 
    }); 
    this.render('todos_test', { 
     into:'todos', 
     outlet: 'test', 
     controller: 'testController' 
    }); 
}, 

setupControllers:function (controller, model) { 
    this.controllerFor('list').set('content', listmodel.find()); 
    this.controllerFor('test').set('content', testmodel.find()); 
} 

La funzione setupControllerControllerFor vi permetterà di assegnare quello che ci siamo posti come 'contesto' nel router precedente.

Nel modello, si dovrebbe nominare punti proprio come prima:

{{outlet list}} 
{{outlet test}} 

Spero che questo aiuti :)

+1

Sembra che setupControllers e renderTemplates sono stati deprecati in braci-latest. – adivis

+0

hmmm ... sei sicuro? le nuove guide sul sito di ember li consigliano: http://emberjs.com/guides/controllers/representing-multiple-models-with-arraycontroller/ –

+2

sono appena stati uniti 5 ore fa. [questo] (https://github.com/emberjs/ember.js/commit/6d771b7a9389fff826b8f2e500721da6a7ce2fc0) e [questo] (https://github.com/emberjs/ember.js/commit/2468b42f801dc192a6e762293f3590d25274dfd0). Ma proverà il tuo codice con le nuove funzioni. – adivis

Problemi correlati