2015-06-16 13 views
5

ho due modelli Admin e User Il mio modello di applicazione è la seguenteEmber.js componenti dinamici

//application.hbs 
{{outlet}} 
{{header-nav}} 

Quello che voglio fare (se è possibile) per rendere {{header-nav}} personalizzabile, spiego: Se il admin autenticare Voglio rendere il componente {{admin-header}} nel caso in cui lo user autentica che deve rendere {{user-header}}. Come posso creare cosa mostrare in application.hbs in modo dinamico?

risposta

3

Si potrebbe definire isAdmin proprietà calcolata in applicazione Controller:

// application controller 
isAdmin: Ember.computed(function() { 
    // your logic here 
}) 

// application template 
{{#if isAdmin}} 
    {{admin-header}} 
{{else}} 
    {{user-admin}} 
{{/if}} 

o si potrebbe avvolgere come header-nav componente isAdmin proprietà, quindi:

// application template 
{{header-nav isAdmin=isAdmin}} 

UPDATE (dettagli con brace-semplice -auth per @Grimmy)

1) Inietti currentUser i nto session (ad esempio, https://stackoverflow.com/a/30894082/4950029)

2) Risolvere currentUser in beforeModel gancio e impostare currentUser proprietà del controller:

//route 
beforeModel: function() { 
    var self = this; 
    this.session.get('currentUser').then(function(user) { 
    self.controllerFor(self.routeName).set('currentUser', user); 
    },function() { 
    self.controllerFor(self.routeName).set('currentUser', null); 
    }); 
} 

//controller 
isAdmin: Ember.computed('currentUser.role', function() { 
    return (this.get('currentUser.role') === 'admin'); 
}), 

//template 
{{#if isAdmin}} 
    {{admin-header}} 
{{else}} 
    {{user-admin}} 
{{/if}} 

o come risposta sopra

//controller 
roleBasedComponentName: Ember.computed('currentUser.role', function() { 
    return ((this.get('currentUser.role') === 'admin') ? 'admin-header' : 'user-header'); 
}) 

//template 
{{component roleBasedComponentName user=currentUser}} 
+0

Mi potete dare un esempio completo del controller per favore? – Grimmy

+1

Ti piacerebbe vedere qualcosa di speciale? – artych

+0

Usando ember-simple-auth per autenticare, voglio ottenere l'attuale user.role per decidere quale vista eseguire il rendering – Grimmy

3

È possibile utilizzare {{component}} aiutante, ma è necessario prima determinare il nome del componente, quindi nel controller:

nameForComponent: Ember.computed('user.isAdmin', function() { 
// if admin return admin-header else user-header 
}) 

Poi, nel modello:

{{component nameForComponent}} 

E 'stato progettato ed introdotto poco tempo fa per questi casi d'uso.

Si può anche andare più fantasia:

{{component (if user.isAdmin 'admin-header' 'user-header') }} 
+0

SO scusate per il mio ritardo, vi ringrazio per la vostra risposta, nameForComponent in quale controller dovrei definirlo per favore (sono nuovo di Ember) – Grimmy

+1

Nel controller dell'applicazione o componente headernav, dipende dal modello che usate helper del componente. –

+0

Ok, puoi darmi un esempio di cosa dovrebbe restituire nameForComponent, sapendo che sto usando Ember-simple-auth per l'autenticazione e nel mio utente ho un attributo role che può prendere "admin" o "user" – Grimmy