2016-07-28 9 views
13

Mam wiele kątowych elementów 1.5, które wszystkie mają takie same atrybuty i strukturę danych. Myślę, że można je ponownie uwzględnić w pojedynczym komponencie, ale potrzebuję sposobu na dynamiczny wybór szablonu na podstawie interpolowanej wartości atrybutu type.Czy istnieje sposób dynamicznego renderowania różnych szablonów dla komponentu kątowego 1.5

var myComponentDef = { 
    bindings: { 
     type: '<' 
    }, 
    templateUrl: // This should be dynamic based on interpolated type value 
}; 

angular.module('myModule').component('myComponent', myComponentDef); 

nie mogę użyć templateUrl function($element, $attrs) {} ponieważ wartości w $attrs są uninterpolated więc nie dostanie typu określonego w przekazany w danych.

Mogę mieć jeden duży szablon z serią dyrektyw ng-if lub ng-switch, ale chciałbym zachować oddzielne szablony.

Alternatywnie, mogę po prostu zachować komponenty oddzielne i używać ng-switch itp. W komponencie nadrzędnym, ale nie podoba mi się to, ponieważ wygląda na to, że jest dużo powtórzeń.

Szukam rozwiązania, w którym można użyć interpolowanego type przekazanego do powiązań, aby dopasować szablon adresu URL do każdego typu, który zostanie następnie użyty do zbudowania komponentu.

Czy to możliwe?

Dzięki

+0

nie sądzę, to jest możliwe, ponieważ wymaga usługi '$ compile', która nie jest dostępna dla komponentów. Możesz jednak użyć dyrektywy. –

+1

Zobacz to proste i eleganckie rozwiązanie: https://stackoverflow.com/a/41743424/1274852 – hkong

Odpowiedz

13

To nie jest coś, że komponenty zostały specjalnie wykonane dla. Zadanie polega na użyciu dyrektywy z dynamicznymi szablonami. Istniejący to ng-include.

Aby użyć go w składniku, powinno być:

var myComponentDef = { 
    bindings: { 
    type: '<' 
    }, 
    template: '<div ng-include="$ctrl.templateUrl">', 
    controller: function() { 
    this.$onChanges = (changes) => { 
     if (changes.type && this.type) { 
     this.templateUrl = this.type + '.html'; 
     } 
    } 
    } 
} 
+0

Dzięki za pomoc. Naprawdę to lubię. Wprowadziłem stałą kątową do kontrolera, który zawiera wszystkie typy mapowania konfiguracji do poszczególnych adresów URL, więc linia może być 'this.templateUrl = typeMapperConfig [this.type];' – Joe

+0

@Joe Oczywiście, to też zadziała. – estus

9

można wstrzykiwać każdą usługę i ustawić dynamiczny url

angular.module('myApp').component("dynamicTempate", { 
 
     controller: yourController, 
 
     templateUrl: ['$routeParams', function (routeParams) { 
 
      
 
      return 'app/' + routeParams["yourParam"] + ".html"; 
 
     
 
     }], 
 
     bindings: { 
 
     }, 
 
     require: { 
 
     } 
 
    });

+0

Znacznie lepsze rozwiązanie niż połączenie ng-include. – toxaq

+0

nie, jeśli potrzebujesz przedmiotu podanego w celu ustalenia, jaki URL powinien być – jzig

+0

możesz wstrzyknąć dowolną usługę i uzyskać jej adres URL oraz zwrócić ten URL –

Powiązane problemy