2013-02-12 16 views
67

Nella funzione di collegamento, esiste un modo più "angolare" per associare una funzione a un evento di clic?Utilizzo di ng-clic o bind all'interno della funzione di collegamento della direttiva angolare

In questo momento, sto facendo ...

myApp.directive('clickme', function() { 
    return function(scope, element, attrs) { 
    scope.clickingCallback = function() {alert('clicked!')}; 
    element.bind('click', scope.clickingCallback); 
} }); 

È questo il modo angolare di farlo o è un brutto hack? Forse non dovrei essere così preoccupato, ma sono nuovo in questa struttura e vorrei conoscere il modo "corretto" di fare le cose, specialmente quando il quadro avanza.

+2

Entrambi sono appropriati da fare, puoi andare avanti e fare qualsiasi cosa tu ritenga opportuno. L'unica differenza nel tuo esempio è che 'bind' fa partire un ciclo' digest'; che potrebbe essere qualcosa che potresti desiderare, ma attenzione. –

+2

Umur, intendevi dire che "legare" non inizia il ciclo di digestione? – demisx

+0

Lo uso quando è necessario evitare un costoso ciclo di digestione, ad esempio un set di dati di grandi dimensioni che richiede un'azione da parte dell'utente. Con la sola differenza che lo uso nel link: function(). – Fred

risposta

61

E 'possibile utilizzare un controller in direttiva:

angular.module('app', []) 
    .directive('appClick', function(){ 
    return { 
     restrict: 'A', 
     scope: true, 
     template: '<button ng-click="click()">Click me</button> Clicked {{clicked}} times', 
     controller: function($scope, $element){ 
     $scope.clicked = 0; 
     $scope.click = function(){ 
      $scope.clicked++ 
     } 
     } 
    } 
    }); 

Demo on plunkr

più su direttive Angular guide. E molto utile per me è stato video dal blog ufficiale Angular post About those directives.

+0

Grazie per il puntatore al post del blog! – ehfeng

+0

In realtà voglio aggiungere l'attributo ng-click all'elemento stesso, non l'elemento template (nel tuo caso, il pulsante). Sai come farlo? – ehfeng

+1

Non importa, l'ho capito - Posso usare l'opzione "Sostituisci" all'interno della direttiva. – ehfeng

36

Penso che vada bene perché ho visto molte persone fare così.

Se si sta definendo il gestore di eventi all'interno della direttiva, non è necessario definirlo sull'oscilloscopio. Seguire andrebbe bene.

myApp.directive('clickme', function() { 
    return function(scope, element, attrs) { 
    var clickingCallback = function() { 
     alert('clicked!') 
    }; 
    element.bind('click', clickingCallback); 
    } 
}); 
+14

Facendo clic su Callbackback, se si stanno modificando i dati del modello/ambito, è possibile chiamare l'ambito. $ Apply() o inserire il contenuto del metodo all'interno dell'ambito. $ Apply (function() {... contents here. ..}); –

10

Non dovrebbe essere semplicemente:

<button ng-click="clickingCallback()">Click me<button> 

perché vuoi scrivere una nuova direttiva solo per mappare il tuo evento click per la richiamata per la vostra portata? ng-click lo fa già per te.

+8

Sono anche curioso delle opinioni su questo. 'ng-click' versus' element.bind() ' – jvannistelrooy

+6

Forse solo per rendere quella parte riutilizzabile, ripetibile il codice altrove. – Estevez

+0

@Estevez è esattamente il mio caso d'uso. – Alisson

-4
myApp.directive("clickme",function(){ 
    return function(scope,element,attrs){ 
     element.bind("mousedown",function(){ 
      <<call the Controller function>> 
       scope.loadEditfrm(attrs.edtbtn); 
     }); 
    }; 
}); 

questo agirà come eventi onclick sul attributo ClickMe

0

Si dovrebbe utilizzare il controller nella direttiva e ng clic nel modello HTML, come risposte precedenti suggerite. Tuttavia, se è necessario manipolare DOM sull'evento (clic), ad esempio facendo clic sul pulsante, si desidera modificare il colore del pulsante o così, quindi utilizzare la funzione Link e utilizzare l'elemento per manipolare il dom.

Se tutto ciò che si vuole fare è mostrare un valore su un elemento HTML o qualsiasi attività di manipolazione non dom, allora potrebbe non essere necessaria una direttiva e può usare direttamente il controller.

Problemi correlati