AngularJS: Denetleyicide girişi manuel olarak $ valid olarak nasıl ayarlayabilirim?


92

TokenInput eklentisini kullanma ve AngularJS yerleşik formController doğrulamasını kullanma.

Şu anda alanın metin içerip içermediğini kontrol etmeye çalışıyorum ve eğer varsa alanı geçerli olarak ayarlıyorum. Eklentiyi kullanmanın sorunu, kendi girdisini ve ardından stlying için bir ul + li oluşturmasıdır.

AddItem (formname) ve denetleyicideki yeteneklerime erişimim var, sadece $ valid olarak ayarlamam gerekiyor.

İşaretleme.

<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 nesneye girilen ve nesneden geçen bir şey olduğunda capabilityValidation işlevini çalıştırıyorum.

DÜZENLE:

Girdiğimde ng-modelini buldum bir şeyler yapıyor ve otomatik tamamlama sonuçlarını alıyor, bu yüzden modele dayandığı için çalışmak için ng-geçerliliğini alamıyorum.

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

Bu otomatik tamamlama uygulamasını ben yazmadım, bunu yapmanın ng-model özniteliğine erişip model işlevini başka bir yere taşıyabileceğim başka bir yolu var mı?


1
Eklentiniz kendi girişini oluşturduğuna ve kendi doğrulamanızı yapmak için bir işlev yazdığınıza göre, neden doğrulama için kendi $ kapsam özelliğinizi de kullanmıyorsunuz: <div ... data-ng-show="capabilities_error" ...> Başka bir deyişle, FormController'ı kullanmak istemeniz / kullanmanız için bir neden var mı?
Mark Rajcok

2
Diğer tüm formlarım onu ​​kullandığından, verdiği kontrolü elimde tutmak isterim. Eklenti tarafından oluşturulan girdi aslında orijinal girdimdeki değeri belirliyor, daha sonra doğrulamamda kontrol etmem gerekiyor, ancak girilen bir değer olduğunda formController'ı güncellemiyor.
Christopher Marshall

Girişi izole etmek için işaretlemeyi kısalttım. Aynı biçimde bir sürü girdim var.
Christopher Marshall

1
Tamam. Denediniz mi addItem.capabilities.$valid = trueve / veya addItem.capabilities ayarı. $ Uygun olarak doğru veya yanlış olarak error.required?
Mark Rajcok

İkisini de denedim. Sorumu size göstermek için güncelleyeceğim. $ Valid ve $ error.required, denetleyicideki kesme noktamda tanımsız olarak görünüyor, ancak addItem.capabilities hala veri içeriyor.
Christopher Marshall

Yanıtlar:


150

Bir formun geçerliliğini doğrudan değiştiremezsiniz. Tüm alt girdiler geçerliyse, form geçerlidir, değilse, o zaman değildir.

Yapmanız gereken, giriş öğesinin geçerliliğini ayarlamaktır. Bunun gibi;

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

Şimdi girdi (ve dolayısıyla form) geçersizdir. Hangi hatanın geçersizliğe neden olduğunu da görebilirsiniz.

addItem.capabilities.errors.youAreFat == true;

1
Ya capabilitiesdeğişkense? Giriş adlarını içeren bir dizim var ve dizinin içinde döngü yapmak ve bunları birer birer geçersiz olarak ayarlamak istiyorum: /
lightalex

1
Değişken derken neyi kastediyorsunuz? Formdaki değerlere değil, doğrudan formun kendisine bağlıdır. Formun nameözniteliğini ve girdinin özniteliğini kullanır id. Bu, tarafından belirlenen değerlerden farklıngModel
Umur Kontacı

11
Çözümü buldum ama demek istediğim $scope.addItem['myVariableName'].$setValidity("youAreFat", false);
buydu

Bundan sonra, bazı giriş alanlarının artık değişiklik veya bulanıklık durumunda doğrulanmadığı anlaşılıyor
Leonardo,

4
Açısal 1.4.7'de ve bu kodun önüne $ kapsam eklemek zorunda kaldım ..$scope.addItem.capabilities.$setValidity("youAreFat", false);
Graham T

61

Yukarıdaki cevaplar sorunumu çözmeme yardımcı olmadı. Uzun bir araştırmadan sonra bu kısmi çözüme rastladım .

Sonunda, giriş alanını manuel olarak ng-geçersiz olarak ayarlamak için bu kodla sorunumu çözdüm (ng-valid olarak ayarlamak için 'doğru' olarak ayarlayın):

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

3
Ben de aynı şeyi yaptım ve harika çalışıyor. Ama şimdi aynı alanı yeniden geçerli kılma konusunda bazı problemlerim var. Çok can sıkıcı olan değişen duruma geçmez. Bir düğmeye tıklamayı onaylamak için ng-model-options = "{updateOn: 'submit'}" kullanıyorum. Bununla ilgili herhangi bir fikrin var mı?
OliverKK

1
@OliverKK Eğer çağırmak gerekir $setValidityile truegiriş geçerli olduğunda ikinci parametre olarak.
Bernhard Hofmann

10
rootcope kullanmak mantıklı değil, sadece kapsam olmalı
Ryan M

1
Benzer bir çözümü denedim, ancak bulduğum sorun, daha sonra formdaki kontrolün değerini değiştirmeye çalışırsam geçersiz kalmasıdır. Benim durumumda bu kontrol, iç seçimle bir direktiftir. Direktifim için geçersiz (ng-form) ayarlarsam, o zaman bu geçersiz durumu kaldıramam.
Naomi

17

Bu gönderiye benzer bir sorunla karşılaştım. Düzeltmem, geçersiz durumumu benim için saklamak için gizli bir alan eklemekti.

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

Benim durumumda, bir kişinin iki farklı düğmeden birini seçmesi gereken null yapılabilir bir bool'um vardı. evet yanıtı verirlerse, koleksiyona bir varlık eklenir ve düğmenin durumu değişir. Tüm sorular cevaplanıncaya kadar (her çiftteki düğmelerden biri tıklanır) form geçerli değildir.

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

O çok basit. Örneğin: JS denetleyicinizde şunu kullanın:

$scope.inputngmodel.$valid = false;

veya

$scope.inputngmodel.$invalid = true;

veya

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

veya

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

Hepsi benim için farklı ihtiyaçlar için çalışıyor. Bu sorununuzu çözerse yukarı vurun.


0

bunun bir tarih hatası için çalışmasını sağlamak için formun geçerli olarak işaretlenmesi için $ setValidity'yi çağırmadan önce hatayı silmem gerekiyordu.

delete currentmodal.form.$error.date;
currentmodal.form.$setValidity('myDate', true);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.