Comment conditionnellement appliquer un modèle personnalisé via Angulaire directives?
Envisager la directive suivante:
angular.module('MyApp').directive('maybeLink', function() {
return {
replace: true,
scope: {
maybeLink: '=',
maybeLinkText: '='
},
template: '<span>' +
' <span ng-hide="maybeLink" ng-bind-html="text"></span>' +
' <a ng-show="maybeLink" href="#" ng-bind-html="text"></a>' +
'</span>',
controller: function($scope) {
$scope.text = $scope.maybeLinkText.replace(/\n/g, '<br>');
}
};
});
La directive ajoute à la fois la <span>
et la <a>
vers les DOM (une seule est visible à un moment donné).
Comment pourrais-je la réécriture de la directive telle qu'il va ajouter soit <span>
ou <a>
pour les DOM, mais pas les deux?
Mise à JOUR
OK, je suppose que je pourrais utiliser ng-if
comme ça:
template: '<span>' +
' <span ng-if="!maybeLink" ng-bind-html="text"></span>' +
' <a ng-if="maybeLink" href="#" ng-bind-html="text"></a>' +
'</span>'
Mais, comment pourrait-on se débarrasser de l'entourage <span>
dans ce cas?
Mise à JOUR 2
Ici est une version de la directive qui utilise $compile
. Il n'a pas l'entourant <span>
, mais les deux sens de la liaison de données ne fonctionne pas non plus. Je suis vraiment intéressé de savoir comment résoudre la double liaison de données de la question. Des idées?
angular.module('MyApp').directive('maybeLink', function($compile) {
return {
scope: {
maybeLink: '=',
maybeLinkText: '='
},
link: function(scope, element, attrs) {
scope.text = scope.maybeLinkText.replace(/\n/g, '<br>');
if (scope.maybeLink) {
element.replaceWith($compile('<a href="#" ng-bind-html="text"></a>')(scope));
} else {
element.replaceWith($compile('<span ng-bind-html="text"></span>')(scope));
}
}
};
});
- Voulez-vous toujours de liaison dynamique, c'est à dire lorsque la valeur de
maybeLink
changements, l'autre élément qui doit s'afficher? Ou avez-vous besoin d'un temps de rendu (simaybeLink
est vrai au moment du rendu de l'illustrer, d'autre spectacle que)? - Je n'ai pas vraiment besoin de la dynamique de la liaison de données. Est-ce à faciliter la mise en œuvre?
- j'ai édité ma réponse, semble travail, malade ajouter le lien à Plunker
Vous devez vous connecter pour publier un commentaire.
Vous pourriez être en mesure d'utiliser un
template
fonction. Selon le docs:scope
, bien sûr.Je pense que c'est la façon la plus propre à injecter un modèle dynamique basé sur une portée de propriété
scope
) pour faire mon directive réutilisable pour les différents composants, mais c'est la réponse à la question.transclude: true
et puisng-transclude
dans l' (dynamique) modèle. Cela ne fonctionne pas, angulaire génère une erreur:Error: [ngTransclude:orphan] Illegal use of ngTransclude directive in the template! No parent directive that requires a transclusion found.
quelqu'un a une idée, comment résoudre cela?Je suis venu avec la version suivante à la fin:
Je voudrais utiliser
ng-switch
.quelque chose comme
ou
Donc, c'est la direction
Plunker
Vous pouvez utiliser ng-si, pour la même
Ci-dessous est l'exemple
Travail De Démonstration
Directive Code:
<span>
?La suite est une solution qui fournit des mises à jour dynamiques. Utilisation:
<a rewrite-as-span="true"></a>
<a rewrite-as-span="false"></a>
<a rewrite-as-span="yourFn()"></a>
etc.
Code et les spécifications comme un gist