如何在Angularjs中禁用按钮时允许ng-click

时间:2014-04-03 17:54:13

标签: forms angularjs validation angularjs-ng-click

我有以下表格:

<form name="formuser" action='/signup' method='post' novalidate>

    <input type="text" name="firstname" ng-model="firstname" ng-class="{ 'has-error' : (formuser.firstname.$invalid && !formuser.firstname.$pristine) || hasSubmitted}" required />

    <button type="submit" ng-disabled="formuser.$invalid" ng-click="hasSubmitted=true">Submit</button>
</form>

我正在尝试将输入字段中的“has-error”类添加到用户输入内容之后无效,或者在输入仍为pristine时点击提交按钮。我已经在提交按钮中添加了ng-disabled以禁用表单子项,但我仍然希望触发ng-click以更改hasSubmitted范围。问题是按钮上的ng-disable也禁用了ng-click。

我知道我总是可以在表单上使用ng-submit,在我的控制器中进行验证,然后触发ajax请求,但我的身份验证框架要求我实际提交表单并重定向浏览器。

4 个答案:

答案 0 :(得分:6)

嗯,而不是制造黑客,最干净的解决方案是启用按钮,只需使用简单的指令处理提交:

angular.module('common', []).directive('preventSubmit', function () {
    return {
        restrict: 'A',
        scope: {
            preventSubmit: '='
        },
        link: function (scope, element) {
            element.bind('submit', function(e) {
                if (scope.preventSubmit) {
                    e.preventDefault();
                }
            });
        }
    }
});

它的作用是什么,它绑定到提交事件,如果表单无效,它会阻止表单提交。如果你不使用动作属性,Angular会自动处理它,你可以处理它,但是如果有指定的动作和正常提交,这个指令非常有用。

在标记中:

<form name="formuser" action='/signup' method='post' 
      novalidate prevent-submit="formuser.$invalid">
  ...
  <button type="submit" ng-click="hasSubmitted=true">Submit</button>
</form>

使用ng-style或ng-class,您可以根据表单状态按预期设置按钮的样式。

答案 1 :(得分:3)

不是将输入设置为disabled,而是将其设置为readonly。这将允许ng-clicks继续运行。

答案 2 :(得分:2)

你可以将它包装在另一个元素中:

<span ng-click="hasSubmitted=true">
  <button type="submit" ng-class="{noclick:formuser.$invalid}" ng-disabled="formuser.$invalid">Submit</button>
</span>

CSS:

.noclick {
  pointer-events: none;
}

答案 3 :(得分:2)

button替换为div。即使div被禁用,ng-click也会被解雇。

有关详细信息,请参阅this post

顺便说一句,你需要在div上设置按钮样式。祝你好运。