2014-05-10 15 views
27

Sto costruendo un albero di navigazione in Angular JS. La maggior parte dei collegamenti nella struttura punterà alle pagine del mio sito Web, ma alcuni potrebbero puntare a siti esterni.Aggiungi condizionalmente target = "_ blank" ai collegamenti con Angular JS

Se l'href di un collegamento inizia con http: // o https: //, allora presumo che il collegamento sia per un sito esterno (una regex come /^https?:\/\// esegue il trucco).

Vorrei applicare l'attributo target = "_ blank" a questi collegamenti. Speravo di farlo con angolare quando sto creando i miei collegamenti:

<ul> 
    <li ng-repeat="link in navigation"> 
     <a ng-href="{{link.href}}" [add target="_blank" if link.href matches /^https?:\/\//]>{{link.title}}</a> 
    </li> 
</ul> 

Qualcuno può darmi una mano?

Grazie

+0

In realtà non farlo. È male dal punto di vista dell'interfaccia utente. Consente ** agli utenti ** di decidere quando aprire nuove finestre o schede. –

+3

So cosa intendi, ma se l'utente si trova sul sito Web e desidera fare clic su un collegamento a una risorsa esterna, ha senso aprire il collegamento in una nuova scheda/finestra anziché reindirizzare la scheda corrente. Lo uso con parsimonia e solo quando penso che essere diretto lontano dal sito senza la sua scheda rimanga aperto sarebbe irritante/confuso per alcuni utenti. –

+0

no. Se un utente si trova su un sito Web e desidera fare clic su un collegamento, è opportuno aprirlo nella stessa scheda. Se vogliono aprirlo in una nuova scheda, faranno Ctrl-clic o fare clic con il tasto destro e dire "Apri in una nuova scheda". NON rompere le convenzioni web. –

risposta

30

Aggiornamento

o utilizzare una direttiva:

module.directive('myTarget', function() { 
    return { 
     restrict: 'A', 
     link: function(scope, element, attrs) { 
      var href = element.href; 
      if(true) { // replace with your condition 
      element.attr("target", "_blank"); 
      } 
     } 
    }; 
}); 

Usage:

<a href="http://www.google.com" my-target>Link</a> 

Quando don 'T bisogno di utilizzare questo con il routing angolare si può semplicemente utilizzare questo:

<a href="http://www.google.com" target="{{condition ? '_blank' : '_self'}}">Link</a> 
+0

Im sotto l'impressione che target = "_ self" impedisca a routeProvider di acquisire la modifica del collegamento. Vedi [qui] (https://groups.google.com/forum/#!topic/angular/basidvjscRk) –

+0

@BenGuest corretto, in questo caso è necessaria una semplice direttiva – Sebastian

+0

Ok, grazie. La direttiva era esattamente ciò che volevo. Immagino che qualsiasi comportamento personalizzato riguardante gli elementi html garantisca la creazione di una direttiva. –

2

Una più semplice direttiva non richiede cambiamenti nel codice HTML per la gestione di tutti <a href="someUrl"> tag, e l'aggiunta di target="_blank" se someURL non bersaglia l'host corrente :

yourModule.directive('a', function() { 
    return { 
    restrict: 'E', 
    link: function(scope, elem, attrs) { 
     var a = elem[0]; 
     if (a.hostname != location.host) 
     a.target = '_blank'; 
    } 
    } 
} 
5

Le soluzioni proposte funziona solo con HREF hard-coded. Falliranno se sono interpolati perché l'angolazione non avrà fatto alcuna interpolazione quando viene eseguita la direttiva. La seguente soluzione funziona su HREF interpolati, e si basa su una soluzione di Javarome:

yourModule.directive('a', function() { 
    return { 
    restrict: 'E', 
    link: function(scope, elem, attrs) { 
     attrs.$observe('href', function(){ 
     var a = elem[0]; 
     if (location.host.indexOf(a.hostname) !== 0) 
      a.target = '_blank'; 
     } 
    } 
    } 
} 
50

Stavo per creare una direttiva come suggerito e poi si rese conto che tutto quello che effettivamente bisogno di fare è questo:

<a ng-attr-target="{{(condition) ? '_blank' : undefined}}"> 
    ... 
</a> 

ng-attr-xyz consente di creare dinamicamente @xyz e se il valore è undefined non viene creato alcun attributo, solo ciò che vogliamo.

+2

questa è stata una grande soluzione semplice per me. Scrive condizionalmente l'attributo, che è ciò di cui avevo bisogno in questo caso. Semplice e ho imparato che posso farlo praticamente con qualsiasi attributo. Grazie! – Hcabnettek

+1

bello, questo è proprio quello che stavo cercando. non vedevo l'ora di aggiungere un'altra direttiva per qualcosa di così semplice! – tenderloin

+1

Questa dovrebbe essere la risposta accettata. –

Problemi correlati