Comment conditionnellement appliquer un modèle personnalisé via Angulaire directives?

DÉMO

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?

DÉMO

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 (si maybeLink 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