2014-01-14 10 views
8

ng-formは、ウィザードの後半部分であるため、最初は無効に設定する必要があります。フォームには要素を含むグリッドが含まれています。各要素には独自の検証がありますが、要素がない場合はフォームが有効と表示されるという問題があります。行の数が0の場合、開始の場合は無効とマークする必要があります。どのようにすればいいですか?anglejsでフォームを無効に設定

+0

[Angularjs:コントローラで入力を$ validに手動で設定するにはどうすればよいですか?](http://stackoverflow.com/questions/15437435/angularjs-how-do-i-manually-set-input-to -valid-in-controller) –

+1

質問に答えがない場合、どのように重複することができますか?それは明らかにそれを行う可能性がありますが、私は答えでそれを実証しています。それがこのQ&Aがここにある理由です。だから、人々はそれを見つけることができます。 – stride

答えて

18

いくつかの調査の後で、次のコードはうまく動作します。コントローラ内:

//Set the form as invalid for start. 
    $timeout(function(){ 
    $scope.orderForm.productsForm.$invalid = true; 
    }); 

タイムアウトは、フォームにアクセスできることを保証します。それらはコントローラを通過する最初のパスで構築されないため、タイムアウトまたは時計が必要です。 フォームを無効とマークします。より良い方法は、ngModelControllerの文書化されたapi $setValidityを使用して無効とマークすることができる入力を見つけることですが、私の使用例では入力がまだありません。

1つの注意点が、これを直接対応する$無効===! $ valid invariantが壊れているので、このハックに注意してください。

1

次はクリーナーソリューションだと思います。

$scope.$watch('myForm', function (a, b) { 
    $scope.myForm.$setValidity('custom', false, window); // 'custom' validation key, binds window as form control 
}); 

私は$watchが好きです。最初は、「フォームがまだ作成されているかどうか」をチェックしてから、有効性を設定しました。

しかし、それは実際には必要ではないようです。$ watchが最初の時刻に実行される前にフォームが作成されます(したがって、時計は変更されません)。

$setValidityはngForm API(私はform.jsソースコード内にあります)の一部であると思われ、$ validと$ invalidの両方を設定するフォームコントロール自体で使用されています。

関連する問題