2016-06-18 16 views
10

Posso utilizzare più di un modello nei componenti di AngularJS 1.5? Ho un componente con un attributo, quindi voglio caricare template diversi in base a quel nome di attributo. Come posso ottenere il caricamento dei modelli in base al nome attributo dell'elemento?Più di un modello nello stesso componente in AngularJS 1.5

jsConfigApp.component('show', { 
templateUrl: 'component/show.html', //How to change it based on attribute value? 
bindings:{ 
    view:"@" 
}, 
controller: function() { 
    console.log(this.view) 
    if (this.view = "user") { 
     console.log("user") 
    } else if (this.view = "user") { 
     console.log("shop") 
    } else { 
     console.log("none") 
    }  
} 
}) 

Grazie.

risposta

6

Io uso due modi per rendere modello dinamico di un componente nel 1.5.x:

1) Far passare attraverso attr proprietà:

templateUrl: function($element, $attrs) { 
     return $attrs.template; 
} 

2) Iniettare un servizio nel modello e ottenere modello da lì:

funzione TemplateURL:

templateUrl: function($element, $attrs,TemplateService) { 
     console.log('get template from service:' + TemplateService.getTemplate()); 
     return TemplateService.getTemplate(); 
} 

In getTemplate funzione di ritorno template URL in base variabile

getTemplate: function(){ 
    if (this.view = "user") { 
      return "user.html"; 
    } else if (this.view = "user") { 
      return "shop.html"; 
    } else { 
     console.log("none") 
    } 
    return "shop.html";  
} 

Passo variabile 'view' alla fabbrica in primo luogo attraverso un metodo set.

Se sono necessarie ulteriori modifiche nel modello html, torna a utilizzare la direttiva e utilizzare il servizio di compilazione con maggiore supporto.

+0

Perfetto, grazie – wmnitin

+0

ho usato questa risposta in contrasto con la risposta più altamente votato. L'utilizzo del metodo di servizio in questa risposta consente di evitare modelli di hard coding. Vedi la nota di interpolazione di @DicBrus qui sotto. –

16

Che ne dici di passare il modello come parametro al componente? Per esempio creare un componente come:

module.component('testComponent', { 
    controllerAs: 'vm', 
    controller: Controller, 
    bindings: { 
     template : '@' 
    }, 
    templateUrl: function($element, $attrs) { 
     var templates = { 
      'first' :'components/first-template.html', 
      'second':'components/second-template.html', 
      'third' :'components/third-template.html' 
     } 
     return templates[$attrs.template]; 
    } 
}); 

E l'utilizzo di componenti, come di seguito possono contribuire

<test-component template='first'></test-component> 
+0

Questa è una soluzione così elegante. Dovrebbe essere la risposta accettata. Grazie! – hkong

+2

funziona solo se si utilizza il valore 'hardcoded' di template = attribute all'interno del tag . Poiché è necessario qualcosa come