AngularJSでフォームが無効な場合に送信ボタンを無効にする


174

私は私のようなフォームを持っています:

<form name="myForm">
    <input name="myText" type="text" ng-model="mytext" required />
    <button disabled="{{ myForm.$invalid }}">Save</button>
</form>

ご覧のとおり、入力が空の場合、ボタンは無効になりますが、テキストが含まれている場合、ボタンは有効に戻りません。どうすれば機能させることができますか?


回答:


339

フォームの名前とng-disabledを使用する必要があります:ここにPlunkerのデモがあります

<form name="myForm">
    <input name="myText" type="text" ng-model="mytext" required />
    <button ng-disabled="myForm.$invalid">Save</button>
</form>

すみません、今使っています。それでも、テキストボックスにテキストが含まれている場合でも、無効になっています
ali

1
+1偶然にも、私はあなたのこの素晴らしい投稿を読んでいました:benlesh.com/2012/11/angular-js-form-validation.html
Ben

フォームがない場合はどうなりますか?div要素でもそれを実行できますか?
VsMaX 2014年

1
@MichaelCwienczek技術的には、ng-formをdivタグに追加できます<div ng-form="myForm"> ... stuff here .. </div>。入力から値を送信する場合は、ボタンを押したときに、ユーザーが[ENTER]を押してフォームを送信する以外に理由がない場合は、タグを使用することを強くお勧めし<form/>ます。しかし、アクセシビリティの懸念などの理由から、これはより良い実践となる可能性もあります。
Ben Lesh 2014年

2
@BenLesh、送信ボタンがフォーム内になく、フォームが無効な場合は無効にする必要がある場合はどうでしょうか。
Green Wizard

33

この回答に追加するには。フォーム名にハイフンを使用した場合にも機能しないことがわかりました(Angular 1.3):

したがって、これは機能しません

<form name="my-form">
    <input name="myText" type="text" ng-model="mytext" required />
    <button ng-disabled="my-form.$invalid">Save</button>
</form>

3
はい、AngularJSフォーム検証では、フォーム名はキャメルケースにする必要があります。
dubilla 2014年

7
経験則として、式のようなすべてのjsはキャメルケース形式のオブジェクトを認識しますが、ダッシュはhtmlのような構文用です
ecoologic

では、フォームがフォームセットのメンバーであり、ハイフン付きの名前( "my_formset_name-0"など)が必要な場合はどうなりますか?
trubliphone、2015年

2
上記の例では、myForm.$invalidまだ機能するmy_formset_name0.$invalidはずです。したがって、あなたの場合は、機能するはずです。
wvdz

29

選択された応答は正しいですが、私のような誰かが、サーバー側に要求を送信する際の非同期検証に問題がある可能性があります-指定された要求の処理中にボタンが無効にされないため、ボタンが点滅し、ユーザーにとってかなり奇妙に見えます。

これを無効にするには、フォームの$ pending状態を処理するだけです。

<form name="myForm">
  <input name="myText" type="text" ng-model="mytext" required />
  <button ng-disabled="myForm.$invalid || myForm.$pending">Save</button>
</form>

非同期検証ソリューションをありがとうございました!
Martin Brandl 2016年

!myForm.$valid非同期の保留中の問題も処理するものを使用する必要があります。itnext.io/valid-and-invalid-in-angular-forms-61cfa3f2a0cd
SavageCore

6

リアクティブフォームを使用している場合、これを使用できます。

<button [disabled]="!contactForm.valid" type="submit" class="btn btn-lg btn primary" (click)="printSomething()">Submit</button>

2
これは「Angular」には有効なアドバイスですが、「AngularJS」には無効です。すなわち、(click)および[disabled]有効なAngularJSコードではありません、また反応性フォームはAngularJSフレームワークの一部です。 「Angularは、今日と明日のAngularの名前です 。AngularJS
dapperdan1985

1

単純なディレクティブを作成し、すべての必須フィールドが入力されるまでボタンを無効にすることができます。

angular.module('sampleapp').directive('disableBtn',
function() {
 return {
  restrict : 'A',
  link : function(scope, element, attrs) {
   var $el = $(element);
   var submitBtn = $el.find('button[type="submit"]');
   var _name = attrs.name;
   scope.$watch(_name + '.$valid', function(val) {
    if (val) {
     submitBtn.removeAttr('disabled');
    } else {
     submitBtn.attr('disabled', 'disabled');
    }
   });
  }
 };
}
);

詳細については、ここをクリックしてください


あなたの解決方法は少し調整するだけでうまくいきます。ありがとう
Tatipaka

ng-disabledAngular 1.xと[disabled]angular 2 | 4.xにネイティブディレクティブがあり、これよりもはるかに適切にテストされているのに、なぜこれを行うのですか?第2に、ネストされたボタンを無効にするフォームをスコープとするディレクティブがあるのはなぜですか。考え抜かれたソリューションIMO。
デビッドバーカー2017年

上記はサンプルディレクティブで、元のチェックボックスはネストされているなど、多くのシナリオがあり、すべてのフォームにHTMLコードを追加して面倒なことをしたくありません。代わりに、このディレクティブがすべてのことを行います。
Prashobh 2017年

1

<form name="myForm">
        <input name="myText" type="text" ng-model="mytext" required/>
        <button ng-disabled="myForm.$pristine|| myForm.$invalid">Save</button>
</form>

もう少し厳しくなりたいなら

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.