Як зробити умову події ng click?


115

Я маю цей код у ng-повторі:

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

Як зробити умову, щоб кнопку було відключено, коли вона є class="disabled"?

Або є спосіб зробити це в Javascript, щоб він виглядав так:

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

Відповіді:


205

Недобре маніпулювати DOM (включаючи перевірку атрибутів) в будь-якому місці, крім директив. Ви можете додати в область застосування якесь значення, яке вказує на те, чи потрібно відключити посилання.

Але інша проблема полягає в тому, що ngDisabled не працює ні на чому, крім елементів керування формою, тому ви не можете використовувати його з <a>, але ви можете використовувати його за допомогою <кнопки> та розміщувати його як посилання.

Інший спосіб полягає у використанні isDisabled || action()ледачої оцінки виразів, тому дія не буде викликана, якщо isDisabledце правда.

Ось обидва рішення: http://plnkr.co/edit/5d5R5KfD4PCE8vS3OSSx?p=preview


67
щоб зробити висновок: ng-click = "isDisabled || action ()" зробив трюк
Алон

27
краще: ||слід &&, хоча це працює у вашому планку, якщо isDisabled - метод подвійних труб продовжувати перевірку на дійсне вираження. Це не так&&
polyclick

7
@polyclick логіка також зміниться. якщо isDisabled повертає true, тоді дія () буде викликана.
UCJava

@polyclick: Суть у тому, щоб не продовжувати перевірку, якщо її вимкнено. Плюс до того, що у вашій версії, якщо isDisabled()повертається помилково, не буде action()викликано, і перевірка "на дійсний вираз" не продовжується.
Себастьян Мах

1
@UCJava, якщо && використовується, то це буде! IsDisabled (або isEnabled). Це або ng-click = "Форма. $ Дійсна && action ()", або ng-click = "Форма. $ Недійсна || дія ()"
Weihui Guo

47

Ми можемо додати подію ng click умовно без використання відключеного класу.

HTML:

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

7

Я використовую вираз &&, який ідеально підходить для мене.

Наприклад,

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

Якщо vm.slideOneValidпомилково, друга частина виразу не запускається. Я знаю, що це введення логіки в DOM, але це швидкий брудний спосіб отримати ng-інвалід і ng-клацання, щоб розмістити приємне.

Просто пам’ятайте, щоб додати ng-модель до елемента, щоб зробити ng-інвалідом роботу.


4

По суті, ng-clickспочатку перевіряє isDisabledі, виходячи з його значення, вирішує, чи слід викликати функцію чи ні.

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

АБО читайте як

<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

Ви можете спробувати використовувати ng-class.
Ось мій простий приклад:
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>

Статус - це спеціальний атрибут об'єкта, ви можете називати його все, що завгодно. У це ім'я класу CSS, то повинно бути або
disabledng-classobject.statustruefalse

Ви можете змінити статус кожного об'єкта у функції disableIt.
У своєму контролері ви можете це зробити:

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

1

У мене була і ця проблема, і я просто з’ясував, що якщо просто видалити "#", проблема вимкнеться. Подобається це :

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

hrefне слід використовувати, використовувати ng-hrefзамість цього.
Феліпе Аларкон

3
@Felipe Alarcon ng-hrefнеобхідний лише тоді, коли потрібно динамічно обчислити шлях. Якщо шлях ніколи не змінюється, hrefдобре.
Равві
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.