2012-09-03 23 views
5

que tienen una etiqueta span que tiene este aspecto:AngularJS Linky filtro stopPropagation

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

dentro de una ng-repetición.

Tengo un problema, si item.Name contiene un correo electrónico o un enlace, el filtro de enlace cambia el html e inserta una etiqueta de anclaje. Ahora cuando hago clic en el enlace, el ng-clic se dispara Y se abre el anclaje, pero solo quiero que se abra el anclaje y evitar que se llame ng-click ... ¿es esto posible?

+0

Hola! ¿Sabes en qué orden se llaman estas devoluciones de llamada? Ancla antes del lapso? –

Respuesta

6

¿Qué tal algo como esto para su html:

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

Y esto para su llamada a la función:

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

Puede haber una manera mejor, pero creo que esto funcionará. Aunque está en el documentation vi $event en this group article.

+0

La cantidad más pequeña de código que es más fácil de entender. Ganar. – Greg

+0

¡Gracias por hacer esto! – yoleg

0

No sé si esto funcionará pero pruébalo.

Agregue un parámetro a su función abierta y pase this como el puntero del elemento dom actual.

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

ahora en su función de apertura código editado:

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 
    . 
    . 
    . 

    } 

por lo que se llama el método pero volverá falsa si se trata de la etiqueta de anclaje.

esto podría no ser lo que quiere pero servirá su propósito :)

+0

Parece que no funciona. 'this' es siempre el lapso, por lo que nunca tendrá un atributo href – Greg

+0

pero dijiste que linky cambia el html y coloca la etiqueta anchore –

+0

Sí, la etiqueta de anclaje está dentro del tramo. Así es como funciona ng-bind-html. Coloca el valor dentro del intervalo y refactores de enlace el HTML para incluir el delimitador. El html final se vería como '' así que poner 'this' en el tramo nunca pasará por el ancla al javascript. – Greg

1

¿Qué le parece usar una directiva?

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"); 
        } 
       } 
      } 
     }; 
    }) 

Y con el restringir: 'E', se le llama como esto

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