2016-03-20 18 views
1

後に非表示にしていません、私がヒットした場合、フォームは、エラーメッセージを持っていない最初はこれが私のHTMLエラーメッセージが角フォーム検証

 <form id = "myform" name="myform" ng-submit="saveForm()" novalidate > 

      <div class="input-group"> 
       <span class="input-group-addon"> <img src="/icon.png" alt=""/> </span>      
       <input type="text" class="form-control" id="username" name="username" ng-model="username" placeholder="Username" autofocus required>      
      </div> 
      <span ng-show="formInvalid">Please enter username</span> 


      <button type="submit" class="btn btn-default" id="saveBtn"> Save </button> 
     </form> 

私の一形態であると、コントローラ内部で、私は

$scope.formInvalid = false; 

$scope.saveForm = function(){ 
    if($scope.myform.username.$invalid){ 
     $scope.formInvalid = true; 
    } 

if($scope.myform.$valid){ 
//....save it.... 

を持っています「保存してください」と入力してください。「ユーザー名を入力してください」と表示されています。

フォームフィールドをクリックしてユーザー名を入力すると、エラーメッセージは表示されません。入力して別の場所をクリックしても、エラーメッセージは表示されません。

私も

if(!$scope.myform.username.$valid){ 
     $scope.formInvalid = true; 
    } 

を試してみて、私はまた、

一緒

if(!$scope.myform.username.$valid){ 
     $scope.formInvalid = true; 
    } 

    if($scope.myform.username.$valid){ 
     $scope.formInvalid = false; 
    } 
を試してみて、問題がまだそこにあります。どうすればデバッグできますか?これをどうやって解決するのですか?

おかげ

答えて

0

あなたは監視イベント、

$scope.$watch('myform.$valid', function(n, o) { 
if(n) { 
$scope.formInvalid = false; 
} else { 
$scope.formInvalid = true; 
} 
}); 

を試すことができます。しかし、あなたがバリデータを使用して起動した場合私も、良いアイデアかもしれません。

+0

「バリデータ」とはどういう意味ですか?あなたは私に例を挙げることができますか?ありがとう – slevin

+0

http:// blog。thoughtram.io/angularjs/2015/01/11/exploring-angular-1.3-validators-pipeline.html –

0

あなたは無効なプロパティをどこにでも形成するようなトリガはしません。バリデータとng-messagesモジュールに組み込まれた角度でこの問題を解決することをお勧めします。有効または無効であり、警告テキストを通知します。 もう1つのアプローチは、入力の有効性に応じて、変更をリッスンし、フォームの無効なプロパティをトリガーおよび更新する入力に対して、ng-changeディレクティブを使用することです。

例:(公式ウェブサイト角度から撮影)

<form name="myForm"> 
    <label> 
    Enter your name: 
    <input type="text" 
      name="myName" 
      ng-model="name" 
      ng-minlength="5" 
      ng-maxlength="20" 
      required /> 
    </label> 
    <pre>myForm.myName.$error = {{ myForm.myName.$error | json }}</pre> 

    <div ng-messages="myForm.myName.$error" style="color:maroon" role="alert"> 
    <div ng-message="required">You did not enter a field</div> 
    <div ng-message="minlength">Your field is too short</div> 
    <div ng-message="maxlength">Your field is too long</div> 
    </div> 
</form> 

私は、これはそれを行うための最もエレガントな方法だと思います。

+0

バリデータと 'ng-messages'の使い方の例を教えてください。ありがとう – slevin

+0

私はちょうど私の元の答えを編集して、見てみましょう。 –

3

フォームの状態を管理するための新しい変数($scope.formInvalid)を導入して維持する必要はありません。 Angularは、フォームの有効/無効状態を維持します。フォームがmyform命名されたよう

、ちょうどmyform.username.$invalidの値に基づいて、ユーザ名についてのメッセージを表示し、myform.$validである場合にのみ、フォームを保存:

HTML

<span ng-show="myform.username.$invalid">Please enter username</span> 

JS

$scope.saveForm = function() { 
    if ($scope.myform.$valid) { 
    // save the form 
    } 
}; 

fiddle

+0

ああ、本当にシンプルなので。 2つのこと。 1-この方法では、メッセージが一切表示されず、フィールドが空で「保存」を押すとメッセージが表示されますか?私は 'ng-show/ng-hide'を' $ valid/$ invalid'と混在させました。 2私のオリジナルの投稿で使っている方法は、Andrew Grantの第20章の「Beginning AngularJS」の書籍にあります。どうしてうまくいかないのですか?私は、その本の中で、それはうまくいくはずだということですね?ありがとう – slevin

+0

1.確かに。 enterを押すと、つまりフォームを送信するとすぐに、フォームが無効であっても、フラグmyform。$ submittedがtrueに設定されます。したがって、 'ng-show =" myform。$ submitted && myform.username。$ invalid "のようなものが、このトリックを行うべきです。 –

+0

2.私はこの本を知らないが、バリデーションメッセージを表示するか隠すように変数 'formInvalid'を導入したのであれば、それは良いアドバイスではないと思う。基本的には、入力で入力を開始するとすぐに 'formInvalid'がfalseに設定されていないので、あなたが指定した例は機能しません。 –

関連する問題