2012-09-03 20 views
5

Ho un tag span che assomiglia a questo:filtro AngularJS Linky stopPropagation

<span ng-bind-html="item.Name | linky" ng-click="open(item)"></span> 

all'interno di un ng-repeat.

Tuttavia, ho un problema, se item.Name contiene un'email o un collegamento il filtro linky cambia il codice html e inserisce un tag di ancoraggio. Ora quando clicco sul link, il ng-click scatta E l'ancora si apre, ma voglio solo che l'ancora si apra e impedisca che ng-click venga chiamato ... è possibile?

+0

Hi! Sai in che ordine vengono richiamati questi richiami di clic? Ancora prima dell'apertura? –

risposta

6

Che ne dite di qualcosa di simile per il vostro html:

<span ng-bind-html="item.Name | linky" ng-click="open(item, $event)"></span> 

E questo per la vostra chiamata di funzione:

$scope.open = function(item, event){ 
    if(event.srcElement.tagName !== 'A'){ 
     alert('do something here with ' + item.Name); 
    }   
} 

Potrebbe esserci un modo migliore ma credo che funzionerà. Anche se è nel documentation ho visto $event in this group article.

+0

La più piccola quantità di codice che sia più facile da capire. Vincere. – Greg

+0

Grazie per averlo fatto! – yoleg

0

Non so se funzionerà, ma provatelo.

Aggiungere un parametro alla funzione di apertura e passare this come puntatore dell'elemento dom corrente.

<span ng-bind-html="item.Name | linky" ng-click="open(item,this)"></span> 

ora nella funzione aperta codice modificato:

function open(item,this) 
    { 
     // will be true if linky had changed the HTML and added anchor tag 
    var children = this.childNodes; 
    for(a in children) 
    { 
     if(children[a].href) 
     { 
      return false; 
     } 
    } 
//your existing code 
    . 
    . 
    . 

    } 

modo che il metodo sarà chiamato, ma restituirà false se è il tag di ancoraggio.

questo potrebbe non essere ciò che si vuole, ma servirà il vostro scopo :)

+0

Sembra non funzionare. "questo" è sempre lo span, quindi non avrà mai un attributo href – Greg

+0

ma hai detto linky cambia il codice html e posiziona il tag di ancoraggio –

+0

Sì, il tag di ancoraggio si trova all'interno dello span. Ecco come funziona ng-bind-html. Mette il valore all'interno dello span, e linky rifiuta l'HTML per includere l'ancora. L'html finale sarebbe simile a '' quindi mettere 'this' sullo span non passerà mai attraverso l'ancora sul javascript. – Greg

1

Come utilizzare una direttiva!

app = angular.module("myModule", ["ngSanitize"]) 
    .directive('linkyDir', function() { 
     return { 
      restrict: 'E', 
      replace: true, 
      scope: { item: '=' }, 
      template: '<span ng-bind-html="item.Name | linky", ng-click="open(item)"></span>', 
      controller: function($scope, $element) { 
       $scope.open = function(item) { 
        if ($element[0].firstChild.tagName !== "A") { 
         console.log("Not an anchor"); 
        } 
        else { 
         console.log("Is an anchor tag"); 
        } 
       } 
      } 
     }; 
    }) 

E con il limitare: 'E', si chiama in questo modo

<p ng-repeat="item in items"> 
    <linky-dir item="item"></linky-dir> 
</p>