AngularJS: ฉันจะตั้งค่าอินพุตเป็น $ valid ในคอนโทรลเลอร์ด้วยตนเองได้อย่างไร


92

การใช้ปลั๊กอินTokenInputและการใช้การตรวจสอบความถูกต้องของฟอร์มคอนโทรลเลอร์ในตัว AngularJS

ตอนนี้ฉันกำลังพยายามตรวจสอบว่าฟิลด์มีข้อความหรือไม่จากนั้นตั้งค่าฟิลด์ให้ถูกต้องหากมี ปัญหาในการใช้ปลั๊กอินคือมันสร้างอินพุตของตัวเองจากนั้น ul + li สำหรับ stlying

ฉันสามารถเข้าถึง 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;
  }
};

ฉันกำลังเรียกใช้ฟังก์ชัน capacityValidation เมื่อ TokenInput มีบางสิ่งที่ป้อนและส่งผ่านในวัตถุ

แก้ไข:

พบว่า ng-model ในอินพุตของฉันทำสิ่งต่างๆและได้รับผลลัพธ์การเติมข้อความอัตโนมัติซึ่งเป็นสาเหตุที่ฉันไม่สามารถใช้งาน ng-valid ได้เนื่องจากเป็นไปตามโมเดล

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

ฉันไม่ได้เขียนการใช้งานการเติมข้อความอัตโนมัตินี้มีวิธีอื่นไหมในการดำเนินการนี้ซึ่งฉันจะสามารถเข้าถึง ng-model attr และย้ายฟังก์ชันโมเดลไปที่อื่นได้หรือไม่


1
เนื่องจากปลั๊กอินของคุณกำลังสร้างอินพุตของตัวเองและคุณได้เขียนฟังก์ชันเพื่อทำการตรวจสอบความถูกต้องของคุณเองทำไมไม่ใช้คุณสมบัติ $ ขอบเขตของคุณเองในการตรวจสอบความถูกต้องด้วย <div ... data-ng-show="capabilities_error" ...> กล่าวอีกนัยหนึ่งคือมีเหตุผลที่คุณต้องการ / จำเป็นต้องใช้ FormController หรือไม่?
Mark Rajcok

2
เนื่องจากรูปแบบอื่น ๆ ทั้งหมดของฉันกำลังใช้อยู่ฉันจึงต้องการควบคุมมันไว้ อินพุตที่สร้างปลั๊กอินจะตั้งค่าในอินพุตดั้งเดิมของฉันซึ่งฉันต้องตรวจสอบในการตรวจสอบความถูกต้องของฉัน แต่จะไม่อัปเดต formController เมื่อมีค่าที่ป้อนเข้า
Christopher Marshall

ฉันย่อมาร์กอัปโดยมีจุดประสงค์เพื่อแยกอินพุต ฉันมีอินพุตอีกมากมายในรูปแบบเดียวกันนี้
Christopher Marshall

1
ตกลง. คุณได้ลองaddItem.capabilities.$valid = trueและ / หรือตั้งค่า addItem.capabilities. $ error.required เป็น true หรือ false ตามความเหมาะสม?
Mark Rajcok

ฉันลองทั้งสองอย่างแล้ว ฉันจะอัปเดตคำถามเพื่อแสดงให้คุณเห็น $ ถูกต้องและ $ error.required แสดงเป็นไม่ได้กำหนดบนเบรกพอยต์ของฉันในคอนโทรลเลอร์ แต่ addItem.capabilities ยังคงมีข้อมูลอยู่
Christopher Marshall

คำตอบ:


150

คุณไม่สามารถเปลี่ยนความถูกต้องของแบบฟอร์มได้โดยตรง หากอินพุตที่สืบทอดมาทั้งหมดถูกต้องแบบฟอร์มนั้นถูกต้องถ้าไม่ใช่แสดงว่าไม่ถูกต้อง

สิ่งที่คุณควรทำคือตั้งค่าความถูกต้องขององค์ประกอบอินพุต ชอบจัง;

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

ตอนนี้อินพุต (และแบบฟอร์ม) ไม่ถูกต้อง คุณยังสามารถดูได้ว่าข้อผิดพลาดใดทำให้เกิดการไม่ถูกต้อง

addItem.capabilities.errors.youAreFat == true;

1
เกิดอะไรขึ้นถ้าcapabilitiesเป็นตัวแปร? ฉันมีอาร์เรย์ที่มีชื่ออินพุตและฉันต้องการวนซ้ำภายในอาร์เรย์และตั้งค่าไม่ถูกต้องทีละรายการ: /
lightalex

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

61

คำตอบข้างต้นไม่ได้ช่วยฉันแก้ปัญหาของฉัน หลังจากค้นหามานานฉันก็ได้พบกับโซลูชันบางส่วนนี้

ในที่สุดฉันก็แก้ปัญหาด้วยรหัสนี้เพื่อตั้งค่าช่องป้อนข้อมูลด้วยตนเองเป็น ng-invalid (เพื่อตั้งค่าเป็น ng-valid ให้ตั้งค่าเป็น 'จริง'):

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

3
ฉันทำสิ่งเดียวกันและได้ผลดี แต่ตอนนี้ฉันมีปัญหาในการตรวจสอบความถูกต้องของฟิลด์เดิมอีกครั้ง มันไม่เปลี่ยนไปสู่สถานะที่เปลี่ยนไปซึ่งเป็นเรื่องที่น่ารังเกียจมาก ฉันใช้ ng-model-options = "{updateOn: 'submit'}" เพื่อตรวจสอบความถูกต้องเมื่อคลิกไปที่ปุ่ม มีความคิดเห็นเกี่ยวกับเรื่องนี้ไหม
OliverKK

1
@OliverKK คุณจะต้องเรียกใช้$setValidityด้วยtrueเป็นพารามิเตอร์ที่สองเมื่อใดก็ตามที่อินพุตถูกต้อง
Bernhard Hofmann

10
ไม่สมเหตุสมผลที่จะใช้รูทสโคปควรเป็นขอบเขต
Ryan M

1
ฉันลองวิธีแก้ปัญหาที่คล้ายกัน แต่ปัญหาที่ฉันพบคือถ้าฉันพยายามเปลี่ยนค่าของตัวควบคุมในรูปแบบแล้วก็ยังคงไม่ถูกต้อง ในกรณีของฉันการควบคุมเป็นคำสั่งที่มีการเลือกภายใน หากฉันตั้งค่าไม่ถูกต้องสำหรับคำสั่งของฉัน (ซึ่งเป็นรูปแบบ ng) ฉันจะไม่สามารถลบสถานะที่ไม่ถูกต้องนั้นได้
Naomi

17

ฉันเจอโพสต์นี้พร้อมกับปัญหาที่คล้ายกัน การแก้ไขของฉันคือการเพิ่มฟิลด์ที่ซ่อนไว้เพื่อระงับสถานะที่ไม่ถูกต้องให้ฉัน

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

ในกรณีของฉันฉันมีบูลที่เป็นโมฆะซึ่งบุคคลต้องเลือกหนึ่งในสองปุ่มที่แตกต่างกัน ถ้าพวกเขาตอบว่าใช่เอนทิตีจะถูกเพิ่มเข้าไปในคอลเลกชันและสถานะของปุ่มจะเปลี่ยนไป จนกว่าคำถามทั้งหมดจะได้รับคำตอบ (ปุ่มใดปุ่มหนึ่งในแต่ละคู่จะมีการคลิก) แบบฟอร์มไม่ถูกต้อง

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;

ทั้งหมดทำงานสำหรับฉันสำหรับความต้องการที่แตกต่างกัน ตีขึ้นหากวิธีนี้ช่วยแก้ปัญหาของคุณได้


0

เพื่อให้สิ่งนี้ทำงานได้สำหรับข้อผิดพลาดวันที่ฉันต้องลบข้อผิดพลาดก่อนที่จะเรียก $ setValidity เพื่อให้แบบฟอร์มถูกทำเครื่องหมายว่าถูกต้อง

delete currentmodal.form.$error.date;
currentmodal.form.$setValidity('myDate', true);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.