J'ai un certain nombre de composants angulaires 1.5 qui prennent tous les mêmes attributs et structure de données. Je pense qu’ils pourraient être redéfinis dans un seul composant, mais j’ai besoin d’un moyen de choisir dynamiquement un modèle basé sur la valeur interpolée de l’attribut type
.
var myComponentDef = {
bindings: {
type: '<'
},
templateUrl: // This should be dynamic based on interpolated type value
};
angular.module('myModule').component('myComponent', myComponentDef);
Je ne peux pas utiliser templateUrl function($element, $attrs) {}
car les valeurs dans $attrs
sont non interpolées, je ne voudrais donc pas obtenir le type spécifié dans les données transmises.
Je pourrais avoir juste un grand modèle avec une série de directives ng-if
ou ng-switch
, mais j'aimerais que les modèles soient séparés.
Alternativement, je pourrais simplement garder les composants séparés et utiliser ng-switch
etc. dans le composant parent, mais je n'aime pas cela, car cela semble être une répétition excessive.
Je recherche une solution permettant d'utiliser la variable type
passée dans les liaisons afin de faire correspondre une URL de modèle pour chaque type, qui sera ensuite utilisée pour générer le composant.
Est-ce possible?
Merci
Ce n’est pas quelque chose pour lequel les composants ont été spécialement conçus. La tâche se réduit à l'utilisation d'une directive avec des modèles dynamiques. Celui qui existe est ng-include
.
Pour l'utiliser dans un composant, il devrait être:
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';
}
}
}
}
Vous pouvez injecter n'importe quel service et définir une URL dynamique
angular.module('myApp').component("dynamicTempate", {
controller: yourController,
templateUrl: ['$routeParams', function (routeParams) {
return 'app/' + routeParams["yourParam"] + ".html";
}],
bindings: {
},
require: {
}
});
De toute façon, vous devez avoir la logique de commutation quelque part, alors pourquoi ne pas la placer simplement dans un modèle de composant parent?
Avoir un modèle AngularJS propre et compréhensible dans ce cas est plus utile à l’OMI qu’un peu de répétition:
<ng-container ng-switch="$ctrl.myComponentDef.type">
<component-type1 ng-switch-when="type1" param="$ctrl.myComponentDef"></component-type1>
<component-type2 ng-switch-when="type2" param="$ctrl.myComponentDef"></component-type2>
</ng-container>
Même si vous modifiez le type myComponentDef. à la volée, les composants du commutateur appellent correctement leurs méthodes respectives $onDestroy
et $onInit
et chargent les données comme prévu - pas de magie, pas de vaudou.