2013-07-09 18 views
13

Ho una funzione nel mio controller che presenta come di seguito:Come posso passare un parametro ad una funzione ng-clic?

AngularJS:

$scope.toggleClass = function(class){ 
    $scope.class = !$scope.class; 
} 

voglio tenerlo generale passando il nome della classe che voglio alternare:

<div class="myClass">stuff</div> 
<div ng-click="toggleClass(myClass)"></div> 

Ma myClass non viene passato alla funzione angolare. Come posso farlo funzionare? Il codice sopra funziona se lo scrivo in questo modo:

$scope.toggleClass = function(){ 
    $scope.myClass = !$scope.myClass; 
} 

Ma, questo non è ovviamente generale. Non voglio hard-code nella classe denominata myClass.

+0

Sembra 'myClass' è una stringa semplice, piuttosto che una variabile? Nell'espressione 'toggleClass (myClass)', myClass dovrebbe essere una variabile su scope, o passarla come stringa 'myClass' – Chandermani

risposta

27

Nella funzione

$scope.toggleClass = function(class){ 
    $scope.class = !$scope.class; 
} 

$scope.class non ha nulla a che fare con la paramter class. È letteralmente una proprietà su $scope denominata class. Se si desidera accedere alla proprietà in $scope cioè identificato dalla variabile class, è necessario utilizzare la funzione di accesso array-style:

$scope.toggleClass = function(class){ 
    $scope[class] = !$scope[class]; 
} 

Si noti che questo non è specifico angolare; questo è il modo in cui funziona JavaScript. Prendiamo il seguente esempio:

> var obj = { a: 1, b: 2 } 
> var a = 'b' 
> obj.a 
    1 
> obj[a] // the same as saying: obj['b'] 
    2 

Inoltre, il codice

<div ng-click="toggleClass(myClass)"></div> 

fa l'ipotesi che ci sia una variabile sul campo di applicazione, per esempio $scope.myClass che valuta una stringa con il nome della proprietà a cui si desidera accedere. Se letteralmente vuole passare nella stringa myClass, avresti bisogno

<div ng-click="toggleClass('myClass')"></div> 

L'esempio non lo rende libera eccellente che state cercando (poiché non v'è una classe denominata myClass sulla parte superiore div).

+0

Questa è la migliore risposta a una domanda che ho mai visto su questo sito (e ci sono un sacco di grandi risposte). Molto chiaro, molto conciso. Grazie mille! –

+0

Felice di aver aiutato! Come ho menzionato recentemente, sentiti libero di [ping me] (http://brandontilley.com/contact.html) se hai altre domande. –

+4

Non è 'class' una parola chiave riservata in javascript? Sono abbastanza sicuro che si rompa in IE. –

Problemi correlati