Come rendere condizionale un evento ng-click?


115

Ho questo codice all'interno di ng-repeat:

<a href="#" class="disabled" ng-click="doSomething(object)">Do something</a>

Come fare a condizione che il pulsante sia disabilitato quando lo è class="disabled"?

O c'è un modo per farlo in Javascript in modo che assomigli a:

$('.do-something-button').click(function(){
  if (!$(this).hasClass('disabled')) {
    do something
  }
});

Risposte:


205

Non è bene manipolare con DOM (incluso il controllo degli attributi) in qualsiasi posto tranne le direttive. È possibile aggiungere all'ambito un valore che indica se il collegamento deve essere disabilitato.

Ma un altro problema è che ngDisabled non funziona su nulla tranne i controlli del modulo, quindi non puoi usarlo con <a>, ma puoi usarlo con <button> e modellarlo come collegamento.

Un altro modo è usare la valutazione pigra di espressioni come in isDisabled || action()modo che l'azione non venga chiamata se isDisabledè vera.

Ecco entrambe le soluzioni: http://plnkr.co/edit/5d5R5KfD4PCE8vS3OSSx?p=preview


67
quindi per concludere: ng-click = "isDisabled || action ()" ha funzionato
Alon,

27
meglio: ||dovrebbe essere &&, sebbene funzioni nel tuo plunk, se isDisabled è un metodo double pipe continua a controllare un'espressione valida. Questo non è il caso di&&
polyclick

7
@polyclick cambierebbe anche la logica. se isDisabled restituisce true, l'azione () verrebbe chiamata.
UCJava

@polyclick: Ma il punto è non continuare a controllare se disabilitato. Inoltre, nella tua versione, se isDisabled()restituisce false, non verrà action()chiamato né il controllo "per un'espressione valida" continuerà.
Sebastian Mach

1
@UCJava, se && viene utilizzato, sarà! IsDisabled (o isEnabled) allora. Può essere ng-click = "Form. $ Valid && action ()" o ng-click = "Form. $ Invalid || action ()"
Weihui Guo

47

Possiamo aggiungere un evento ng-click in modo condizionale senza usare la classe disabilitata.

HTML:

<div ng-repeat="object in objects">
<span ng-click="!object.status && disableIt(object)">{{object.value}}</span>
</div>

7

Uso l'espressione && che funziona perfettamente per me.

Per esempio,

<button ng-model="vm.slideOneValid" ng-disabled="!vm.slideOneValid" ng-click="vm.slideOneValid && vm.nextSlide()" class="btn btn-light-green btn-medium pull-right">Next</button>

Se vm.slideOneValidè falso, la seconda parte dell'espressione non viene attivata. So che questo sta inserendo la logica nel DOM, ma è un modo rapido e sporco per disabilitare ng e fare clic per posizionarlo correttamente.

Ricorda solo di aggiungere ng-model all'elemento per far funzionare ng-disabled.


4

Fondamentalmente ng-clickprima controlla il isDisablede in base al suo valore deciderà se la funzione deve essere chiamata o meno.

<span ng-click="(isDisabled) || clicked()">Do something</span>

O leggilo come

<span ng-click="(if this value is true function clicked won't be called. and if it's false the clicked will be called) || clicked()">Do something</span>

1

Potresti provare a usare ng-class.
Ecco il mio semplice esempio:
http://plnkr.co/edit/wS3QkQ5dvHNdc6Lb8ZSF?p=preview

<div ng-repeat="object in objects">
  <span ng-class="{'disabled': object.status}" ng-click="disableIt(object)">
    {{object.value}}
  </span>
</div>

Lo stato è un attributo personalizzato dell'oggetto, puoi chiamarlo come preferisci.
L' disabledin ng-classè un nome di classe CSS, il object.statusdovrebbe essere trueofalse

È possibile modificare lo stato di ogni oggetto in funzione disableIt.
Nel tuo controller, puoi fare questo:

$scope.disableIt = function(obj) {
  obj.status = !obj.status
}

1

Ho avuto anche questo problema e ho semplicemente scoperto che se rimuovi semplicemente il "#" il problema si interrompe. Come questo :

<a href="" class="disabled" ng-click="doSomething(object)">Do something</a>

hrefnon dovrebbe essere usato, usa ng-hrefinvece.
Felipe Alarcon

3
@Felipe Alarcon ng-hrefè necessario solo quando è necessario calcolare il percorso in modo dinamico. Se il percorso non cambia mai, hrefva bene.
Ravvy
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.