Wie kann ein ng-click-Ereignis an Bedingungen geknüpft werden?

115

Ich habe diesen Code in ng-repeat:

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

Wie kann eine Bedingung festgelegt werden, dass die Schaltfläche deaktiviert ist, wenn dies der Fall ist class="disabled"?

Oder gibt es eine Möglichkeit, dies in Javascript zu tun, damit es so aussieht:

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

Antworten:

205

Es ist nicht gut, mit DOM (einschließlich der Überprüfung von Attributen) an einem anderen Ort als Direktiven zu manipulieren. Sie können dem Bereich einen Wert hinzufügen, der angibt, ob die Verknüpfung deaktiviert werden soll.

Ein weiteres Problem ist, dass ngDisabled nur mit Formularsteuerelementen funktioniert. Sie können es also nicht mit <a> verwenden, sondern mit <button> und als Link formatieren.

Eine andere Möglichkeit besteht darin, Ausdrücke wie diese faul auszuwerten, isDisabled || action()damit die Aktion nicht aufgerufen wird, wenn sie isDisabledwahr ist.

Hier sind beide Lösungen: http://plnkr.co/edit/5d5R5KfD4PCE8vS3OSSx?p=preview

Valentyn Shybanov
quelle
67
Also zum Schluss: ng-click = "isDisabled || action ()" hat es geschafft
Alon
27
besser: ||sollte sein &&, obwohl es in Ihrem Plunk funktioniert, wenn isDisabled eine Methode ist, suchen Double Pipes weiter nach einem gültigen Ausdruck. Dies ist nicht der Fall mit&&
Polyklick
7
@polyclick die Logik würde sich dann auch ändern. Wenn isDisabled true zurückgibt, wird action () aufgerufen.
UCJava
@polyclick: Es geht aber nicht darum , weiter zu prüfen, ob es deaktiviert ist. Wenn in Ihrer Version isDisabled()false zurückgegeben wird, wird weder action()aufgerufen, noch wird die Überprüfung "auf einen gültigen Ausdruck" fortgesetzt.
Sebastian Mach
1
@UCJava, wenn && verwendet wird, ist es dann! IsDisabled (oder isEnabled). Es ist entweder ng-click = "Form. $ Valid && action ()" oder ng-click = "Form. $ Invalid || action ()"
Weihui Guo
47

Wir können ng-click-Ereignisse bedingt hinzufügen, ohne die deaktivierte Klasse zu verwenden.

HTML:

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

Ich benutze den && Ausdruck, der perfekt für mich funktioniert.

Beispielsweise,

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

Wenn vm.slideOneValidfalse ist, wird der zweite Teil des Ausdrucks nicht ausgelöst. Ich weiß, dass dies Logik in das DOM einfügt, aber es ist ein schneller und schmutziger Weg, um ng zu deaktivieren und ng-click zu platzieren, um nett zu platzieren.

Denken Sie daran, dem Element ein ng-Modell hinzuzufügen, damit ng-deaktiviert funktioniert.

Nick Res
quelle
4

Grundsätzlich wird ng-clickzuerst überprüft isDisabledund anhand des Werts entschieden, ob die Funktion aufgerufen werden soll oder nicht.

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

ODER lesen Sie es als

<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>
Anfänger
quelle
1

Sie könnten versuchen, zu verwenden ng-class.
Hier ist mein einfaches Beispiel:
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>

Der Status ist ein benutzerdefiniertes Attribut des Objekts. Sie können es beliebig benennen.
Das disabledin ng-classist ein CSS-Klassenname, das object.statussollte trueoder seinfalse

Sie können den Funktionsstatus jedes Objekts ändern disableIt.
In Ihrem Controller können Sie Folgendes tun:

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

Ich hatte auch dieses Problem und habe einfach herausgefunden, dass das Problem behoben ist, wenn Sie einfach das "#" entfernen. So was :

<a href="" class="disabled" ng-click="doSomething(object)">Do something</a>
pollux1er
quelle
hrefsollte nicht verwendet werden, verwenden Sie ng-hrefstattdessen.
Felipe Alarcon
3
@Felipe Alarcon ng-hrefist nur erforderlich, wenn Sie den Pfad dynamisch berechnen müssen. Wenn sich der Pfad nie ändert, hrefist das in Ordnung.
Ravvy