如何使ng-click事件成为条件?


115

我在ng-repeat中有以下代码:

<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
  }
});

Answers:


205

除指令外,在任何地方都不能使用DOM(包括属性检查)进行操作。您可以在范围内添加一些值,该值指示是否应禁用链接。

但是另一个问题是ngDisabled除了表单控件之外不能在其他任何东西上使用,因此您不能将其与<a>一起使用,但是可以将其与<button>一起使用并将其设置为链接样式。

另一种方法是使用表达式的惰性求值,例如isDisabled || action(),如果isDisabled为true,则不调用动作。

这里有两个解决方案:http : //plnkr.co/edit/5d5R5KfD4PCE8vS3OSSx?p=preview


67
因此可以得出结论:ng-click =“ isDisabled || action()”达到了目的
Alon

27
更好:||应该是&&,尽管它可以在您的插件中使用,但是如果isDisabled是双管道继续检查有效表达式的方法。&&
polyclick 2014年

7
@polyclick逻辑也会随之改变。如果isDisabled返回true,则将调用action()。
UCJava

@polyclick:但要点是不要继续检查是否已禁用。另外,在您的版本中,如果isDisabled()返回false,则action()不会调用它,也不会继续检查“寻找有效的表达式”。
塞巴斯蒂安·马赫

1
@UCJava,如果使用&&,则它将!isDisabled(或isEnabled)。是ng-click =“ Form。$ valid && action()”或ng-click =“ Form。$ invalid || action()”
Guoweihui

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为false,则不触发表达式的第二部分。我知道这是将逻辑放入DOM中的方法,但这是使ng禁用和ng-click放置良好的一种肮脏方法。

只需记住将ng-model添加到元素中即可禁用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>

状态是对象的自定义属性,您可以随意命名。
disabledng-class是一个CSS类名,object.status应该是truefalse

您可以在function中更改每个对象的状态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很好。
拉夫维
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.