AngularJS : 컨트롤러에서 입력을 $ valid로 수동으로 설정하는 방법은 무엇입니까?


92

은 Using TokenInput의 플러그인 및 내장 FormController에 확인 AngularJS와를 사용하여.

지금은 필드에 텍스트가 포함되어 있는지 확인하고있는 경우 필드를 유효한 것으로 설정하려고합니다. 플러그인 사용의 문제는 자체 입력을 생성 한 다음 stlying을위한 ul + li를 생성한다는 것입니다.

컨트롤러에서 addItem (formname) 및 내 기능에 액세스 할 수 있습니다. $ 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 속성에 액세스하고 모델 함수를 다른 곳으로 옮길 수있는 또 다른 방법이 있습니까?


1
플러그인이 자체 입력을 생성하고 자체 유효성 검사를 수행하는 함수를 작성 했으므로 유효성 검사를 위해 자체 $ scope 속성도 사용하지 않는 <div ... data-ng-show="capabilities_error" ...> 이유는 무엇입니까? 즉, FormController를 사용하려는 이유가 있습니까?
Mark Rajcok 2013 년

2
내 다른 모든 양식이 그것을 사용하고 있기 때문에 나는 그것이 제공하는 통제를 유지하고 싶습니다. 플러그인 생성 입력은 실제로 원래 입력에 값을 설정하므로 유효성 검사에서 확인해야하지만 입력 된 값이있을 때 formController를 업데이트하지 않습니다.
Christopher Marshall

입력을 분리하기 위해 의도적으로 마크 업을 줄였습니다. 이 같은 형태로 더 많은 입력이 있습니다.
Christopher Marshall

1
괜찮아. addItem.capabilities.$valid = trueaddItem.capabilities. $ error.required를 적절하게 true 또는 false로 설정 했습니까 ?
Mark Rajcok 2013 년

나는 둘 다 시도했다. 내 질문을 업데이트하여 보여 드리겠습니다. $ valid 및 $ error.required는 컨트롤러의 중단 점에서 정의되지 않은 것으로 표시되지만 addItem.capabilities에는 여전히 데이터가 있습니다.
Christopher Marshall

답변:


150

양식의 유효성을 직접 변경할 수 없습니다. 모든 하위 입력이 유효하면 양식이 유효하고 유효하지 않으면 유효하지 않습니다.

해야 할 일은 입력 요소의 유효성을 설정하는 것입니다. 그렇게;

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

이제 입력 (및 양식)이 유효하지 않습니다. 또한 어떤 오류가 무효화를 일으키는지도 확인할 수 있습니다.

addItem.capabilities.errors.youAreFat == true;

1
capabilities변수 라면 어떨까요? 입력 이름을 포함하는 배열이 있고 배열 내부를 반복하고 하나씩 유효하지 않게 설정하고
싶습니다

1
변수 란 무엇을 의미합니까? 양식의 값이 아니라 양식 자체에 직접 연결됩니다. 양식의 name속성과 입력의 id속성을 사용합니다. 이 설정 한 값과 다른ngModel
Umur Kontacı

11
나는 해결책을 발견하지만이 무슨 의미가 있었다 :$scope.addItem['myVariableName'].$setValidity("youAreFat", false);
lightalex

이 후 일부 입력 필드가 변경 또는 흐림에 대해 더 이상 유효성을 검사하지 않는 것으로 보입니다
Leonardo

4
각도 1.4.7에서이 코드 앞에 $ scope를 붙여야했습니다.$scope.addItem.capabilities.$setValidity("youAreFat", false);
Graham T

60

위의 답변은 내 문제를 해결하는 데 도움이되지 않았습니다. 긴 검색 끝에 나는이 부분적인 해결책에 부딪혔다 .

마침내 입력 필드를 ng-invalid로 수동으로 설정하는이 코드로 문제를 해결했습니다 (ng-valid로 설정하려면 'true'로 설정).

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

3
나는 똑같은 일을했고 그것은 훌륭하게 작동합니다. 하지만 지금은 동일한 필드를 재 검증하는 데 몇 가지 문제가 있습니다. 변경된 상태로 변경되지 않아 매우 성가신 일입니다. ng-model-options = "{updateOn : 'submit'}"를 사용하여 버튼 클릭시 유효성을 검사합니다. 이것에 대한 어떤 생각?
OliverKK

1
@OliverKK 당신은 호출해야합니다 $setValidity으로 true입력이 유효 할 때마다 두 번째 매개 변수로.
Bernhard Hofmann

10
rootscope를 사용하는 것으로 이해가되지 않습니다, 단지해야 범위
라이언 M

1
비슷한 솔루션을 시도했지만 문제는 양식에서 컨트롤 값을 변경하려고하면 유효하지 않다는 것입니다. 제 경우에는 컨트롤이 내부 선택이있는 지시문입니다. 내 지시문 (ng-form)에 대해 유효하지 않은 것으로 설정하면 유효하지 않은 상태를 제거 할 수 없습니다.
Naomi

18

비슷한 문제가있는이 게시물을 보았습니다. 내 수정 사항은 잘못된 상태를 유지하기 위해 숨겨진 필드를 추가하는 것이 었습니다.

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

제 경우에는 사람이 두 개의 다른 버튼 중 하나를 선택해야하는 nullable bool이있었습니다. 예라고 답하면 엔티티가 컬렉션에 추가되고 버튼 상태가 변경됩니다. 모든 질문에 답할 때까지 (각 쌍의 버튼 중 하나를 클릭 할 때까지) 양식이 유효하지 않습니다.

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.