AngularJS:コントローラーで$ validに手動で入力を設定するにはどうすればよいですか?


92

使用TokenInputのプラグインを内蔵してformController検証AngularJSを使用。

現在、フィールドにテキストが含まれているかどうかを確認し、含まれている場合はフィールドを有効に設定しようとしています。プラグインを使用する際の問題は、プラグインが独自の入力を作成し、それからul + liを作成することです。

コントローラでaddItem(フォーム名)と私の機能にアクセスできます。$ validに設定するだけです。

マークアップ。

<form class="form-horizontal add-inventory-item" name="addItem">
     <input id="capabilities" name="capabilities" token-input data-ng-model="inventoryCapabilitiesAutoComplete" data-on-add="addCapability()" data-on-delete="removeCapability()" required>
     <div class="required" data-ng-show="addItem.capabilities.$error.required" title="Please enter capability."></div>
</form>

JS

$scope.capabilityValidation = function (capability) {
  if (capability.name !== "") {
    addItem.capabilities.$valid = true;
    addItem.capabilities.$error.required = false;
  } else {
    addItem.capabilities.$valid = false;
    addItem.capabilities.$error.required = true;
  }
};

TokenInputに何かが入力され、オブジェクトに渡されたときに、capabilityValidation関数を実行しています。

編集:

私の入力でng-modelが見つかり、オートコンプリートの結果が得られます。これは、モデルに基づいているため、ng-validが機能しない理由です。

$scope.inventoryCapabilitiesAutoComplete = {
  options: {
    tokenLimit: null
  },
  source: urlHelper.getAutoComplete('capability')
};

私はこのオートコンプリートの実装を記述していませんが、ng-model attrにアクセスしてモデル関数を別の場所に移動する方法はありますか?


1
プラグインが独自の入力を作成していて、独自の検証を行う関数を記述しているので、検証のために独自の$ scopeプロパティを使用するだけ <div ... data-ng-show="capabilities_error" ...> ではありません。
Mark Rajcok 2013年

2
私の他のすべてのフォームがそれを使用しているので、それが与える制御を維持したいと思います。プラグインで作成された入力は、実際に元の入力に値を設定します。これを検証でチェックする必要がありますが、入力された値がある場合、formControllerは更新されません。
クリストファーマーシャル

入力を分離するために、意図的にマークアップを短くしました。この同じ形式の入力がもっとたくさんあります。
クリストファーマーシャル

1
はい。あなたがしようとしましたaddItem.capabilities.$valid = trueおよび/またはaddItem.capabilitiesを設定する。$適宜trueまたはfalseにerror.required?
Mark Rajcok 2013年

両方試しました。質問を更新して表示します。$ validおよび$ error.requiredは、コントローラーのブレークポイントで未定義として表示されますが、addItem.capabilitiesにはまだデータがあります。
クリストファーマーシャル

回答:


150

フォームの有効性を直接変更することはできません。すべての子孫入力が有効な場合、フォームは有効です。有効でない場合、有効ではありません。

入力エレメントの有効性を設定することです。そのようです;

addItem.capabilities.$setValidity("youAreFat", false);

これで入力(およびフォーム)は無効になります。また、どのエラーが無効化の原因であるかも確認できます。

addItem.capabilities.errors.youAreFat == true;

1
capabilities変数の場合はどうなりますか?入力名を含む配列があり、配列内でループしてそれらを1つずつ無効に設定したい:/
lightalex

1
変数とはどういう意味ですか?フォーム内の値ではなく、フォーム自体に直接関連付けられています。フォームのname属性と入力のid属性を使用します。これは、ngModel
UmurKontacı2014

11
私は解決策を見つけましたが、これは私が意味したことでした:$scope.addItem['myVariableName'].$setValidity("youAreFat", false);
lightalex '28 / 07/28

この後、一部の入力フィールドが変更またはぼかしで検証されなくなったようです
Leonardo

4
角度1.4.7と私に.. $範囲で、このコードの前に付ける必要があった$scope.addItem.capabilities.$setValidity("youAreFat", false);
グラハムT

60

上記の答えは私が私の問題を解決するのに役立ちませんでした。長い調査の末、私はこの部分的な解決策に出くわしました。

入力フィールドを手動でng-invalidに設定する(ng-validに設定するには、「true」に設定する)ために、このコードで問題を最後に解決しました:

$scope.myForm.inputName.$setValidity('required', false);

3
私は同じことをしました、そしてそれは素晴らしい働きをします。しかし、今は同じフィールドを再検証する際にいくつかの問題があります。それは非常に煩わしい変更された状態に変化しません。ng-model-options = "{updateOn: 'submit'}"を使用して、ボタンをクリックして検証します。これについて何か考えはありますか?
OliverKK 2014

1
あなたが起動する必要があります@OliverKK $setValiditytrue入力が有効である時はいつでも2番目のパラメータとして。
Bernhard Hofmann

10
ルートスコープを使用しても意味がありません。スコープである必要があります
Ryan M

1
同様の解決策を試しましたが、フォームのコントロールの値を変更しようとしても無効のままであるという問題が見つかりました。私の場合、その制御は内部選択を使用したディレクティブです。ディレクティブ(ng-form)に無効を設定すると、無効なステータスを削除できなくなります。
直美

18

私は同様の問題でこの投稿に出くわしました。私の修正は、無効な状態を保持する非表示フィールドを追加することでした。

<input type="hidden" ng-model="vm.application.isValid" required="" />

私の場合、私は人が2つの異なるボタンの1つを選択しなければならないnull許容のブール値を持っていました。彼らが「はい」と答えると、エンティティがコレクションに追加され、ボタンの状態が変化します。すべての質問に回答するまで(各ペアのボタンの1つがクリックされるまで)、フォームは無効です。

vm.hasHighSchool = function (attended) { 
  vm.application.hasHighSchool = attended;
  applicationSvc.addSchool(attended, 1, vm.application);
}
<input type="hidden" ng-model="vm.application.hasHighSchool" required="" />
<div class="row">
  <div class="col-lg-3"><label>Did You Attend High School?</label><label class="required" ng-hide="vm.application.hasHighSchool != undefined">*</label></div>
  <div class="col-lg-2">
    <button value="Yes" title="Yes" ng-click="vm.hasHighSchool(true)" class="btn btn-default" ng-class="{'btn-success': vm.application.hasHighSchool == true}">Yes</button>
    <button value="No" title="No" ng-click="vm.hasHighSchool(false)" class="btn btn-default" ng-class="{'btn-success':  vm.application.hasHighSchool == false}">No</button>
  </div>
</div>

2

とても簡単です。たとえば、JSコントローラーでは次のようにします。

$scope.inputngmodel.$valid = false;

または

$scope.inputngmodel.$invalid = true;

または

$scope.formname.inputngmodel.$valid = false;

または

$scope.formname.inputngmodel.$invalid = true;

さまざまな要件ですべてが機能します。これで問題が解決した場合は、問題を解決してください。

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