2013-01-31 13 views
5

Per impostazione predefinita, Ember inserisce la vista di una risorsa secondaria in una {{outlet}} definita da una vista di una risorsa padre. Come faccio a sovrascriverlo? Ad esempio, inserire la vista secondaria nello {{outlet}} definita dalla vista applicazione. Perché è questo il valore predefinito?Ember.js: Inserimento della vista risorse secondarie nell'outlet dell'applicazione principale

Usecase: C'è una risorsa users, con un percorso new al suo interno. Voglio che lo {{outlet}} appaia nelle applicazioni anziché nella risorsa madre {{outlet}}.

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

risposta

14

Per ogni percorso abbiamo un metodo di renderTemplate che possiamo sovraccaricare. Questo ci dà il controllo completo sul rendering delle visualizzazioni.

Per esempio, siamo in grado di specificare in cui {{outlet}} la vista sarà rendering con into:

(suppongo questo è il vostro caso d'uso, ma sono un po 'oggi distratto.)

var UsersRoute = Ember.Route.extend({ 
    renderTemplate: function() { 
     this.render('users', { 
      // Render the UsersView into the outlet found in application.hbs 
      into: 'application' 
     }); 
    } 
}); 

possiamo anche specificare il nome di sbocco per rendere in utilizzando la proprietà outlet:

var UsersRoute = Ember.Route.extend({ 
    renderTemplate: function() { 
     this.render('users', { 
      // Render the UsersView into the outlet named "sidebar" 
      outlet: 'sidebar' 
     }); 
    } 
}); 

E ovviamente possiamo usare una combinazione di entrambi per specificare sia il nome della presa, sia dove si trova quella presa utilizzando la proprietà into.

+0

È possibile aggiungere una nuova vista anziché sostituirla? Ho un pannello su cui sto lavorando che vogliamo sovrapporre leggermente agli altri elementi della pagina. Ciò significa che lo stiamo inserendo direttamente nel tag body (proprio all'interno del template dell'applicazione). Sarebbe l'ideale se potessi iniettarlo a livello di codice piuttosto che dover renderlo in fase di inizializzazione. – commadelimited

+1

Non sono sicuro di essere completamente comprensivo, ma forse un 'Ember.ContainerView' soddisfa le tue esigenze? http://emberjs.com/api/classes/Ember.ContainerView.html – Wildhoney

+0

Sì. Buona risposta. ContainerView è quello con cui sono andato e funziona benissimo. Grazie. – commadelimited

Problemi correlati