AngularJS: Làm cách nào để đặt đầu vào theo cách thủ công thành $ hợp lệ trong bộ điều khiển?


92

Sử dụng plugin TokenInput và sử dụng xác thực formController tích hợp sẵn trong AngularJS.

Ngay bây giờ, tôi đang cố gắng kiểm tra xem trường có chứa văn bản hay không và sau đó đặt trường thành hợp lệ nếu có. Vấn đề với việc sử dụng plugin là nó tạo ra đầu vào của riêng nó và sau đó là ul + li để đọc.

Tôi có quyền truy cập vào addItem (tên biểu mẫu) và tài khoản của tôi trong bộ điều khiển, tôi chỉ cần đặt nó thành $ hợp lệ.

Đánh dấu.

<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;
  }
};

Tôi đang chạy chức năng abilityValidation khi TokenInput có nội dung nào đó được nhập và truyền vào đối tượng.

BIÊN TẬP:

Tìm thấy ng-model trên đầu vào của tôi thực hiện công việc và nhận được kết quả tự động hoàn thành, đó là lý do tại sao tôi không thể làm cho ng-valid hoạt động vì nó dựa trên mô hình.

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

Tôi đã không viết phần triển khai tự động hoàn thành này, có cách nào khác để thực hiện việc này trong đó tôi có quyền truy cập vào ng-model attr và di chuyển chức năng mô hình đến một nơi khác không?


1
Vì plugin của bạn đang tạo đầu vào của riêng nó và bạn đã viết một hàm để thực hiện xác thực của riêng mình, tại sao không chỉ sử dụng thuộc tính $ scope của riêng bạn để xác thực: <div ... data-ng-show="capabilities_error" ...> Nói cách khác, có lý do gì bạn muốn / cần sử dụng FormController không?
Mark Rajcok

2
Vì tất cả các biểu mẫu khác của tôi đang sử dụng nó, tôi muốn giữ quyền kiểm soát mà nó cung cấp. Đầu vào được tạo plugin thực sự đặt giá trị trong đầu vào ban đầu của tôi, sau đó tôi cần kiểm tra lại trong quá trình xác thực của mình nhưng nó không cập nhật formController khi có giá trị đã nhập.
Christopher Marshall,

Tôi đã cố tình rút ngắn phần đánh dấu để cô lập đầu vào. Tôi có nhiều đầu vào hơn trong cùng một hình thức này.
Christopher Marshall,

1
Được chứ. Bạn đã thử addItem.capabilities.$valid = truevà / hoặc đặt addItem.capabilities. $ Error. được yêu cầu thành true hoặc false khi thích hợp chưa?
Mark Rajcok

Tôi đã thử cả hai. Tôi sẽ cập nhật câu hỏi của tôi để cho bạn thấy. $ Hợp lệ và $ error.required hiển thị là không xác định trên điểm ngắt của tôi trong bộ điều khiển nhưng addItem.capabilities vẫn có dữ liệu.
Christopher Marshall,

Câu trả lời:


150

Bạn không thể thay đổi trực tiếp tính hợp lệ của biểu mẫu. Nếu tất cả các đầu vào hậu duệ là hợp lệ, biểu mẫu là hợp lệ, nếu không, thì không phải.

Những gì bạn nên làm là thiết lập tính hợp lệ của phần tử đầu vào. Như vậy;

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

Bây giờ đầu vào (và vì vậy biểu mẫu) không hợp lệ. Bạn cũng có thể xem lỗi nào gây ra sự vô hiệu.

addItem.capabilities.errors.youAreFat == true;

1
Nếu capabilitieslà một biến thì sao? Tôi có một mảng chứa tên đầu vào và tôi muốn lặp trong mảng và đặt chúng không hợp lệ từng người một: /
lightalex

1
Bạn có nghĩa là gì bởi biến? Nó được gắn trực tiếp với chính biểu mẫu, không phải các giá trị trong biểu mẫu. Nó sử dụng namethuộc tính của biểu mẫu và idthuộc tính của đầu vào . Điều này khác với các giá trị được đặt bởingModel
Umur Kontacı

11
Tôi tìm thấy giải pháp nhưng đây là những gì tôi có nghĩa là:$scope.addItem['myVariableName'].$setValidity("youAreFat", false);
lightalex

Sau đó, có vẻ như một số trường đầu vào không còn xác thực nữa khi thay đổi hoặc bị mờ
Leonardo

4
Vào ngày 1.4.7 góc và tôi đã phải đặt tiền tố mã này bằng $ scope ..$scope.addItem.capabilities.$setValidity("youAreFat", false);
Graham T

60

Các câu trả lời ở trên không giúp tôi giải quyết vấn đề của mình. Sau một thời gian dài tìm kiếm, tôi đã tìm ra giải pháp từng phần này .

Cuối cùng tôi đã giải quyết được vấn đề của mình với mã này để đặt trường nhập theo cách thủ công thành ng-không hợp lệ (để đặt thành ng-hợp lệ, hãy đặt trường đó thành 'đúng'):

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

3
Tôi đã làm điều tương tự và nó hoạt động tốt. Nhưng bây giờ tôi gặp một số vấn đề khi xác thực lại cùng một trường. Nó không thay đổi trạng thái đã thay đổi, đó là rất an toàn. Tôi sử dụng ng-model-options = "{updateOn: 'submit'}" để xác thực khi nhấp vào nút. Bất kỳ suy nghĩ về điều này?
OliverKK

1
@OliverKK bạn sẽ cần gọi $setValidityvới truelàm tham số thứ hai bất cứ khi nào đầu vào hợp lệ.
Bernhard Hofmann

10
không hợp lý khi sử dụng rootcope, chỉ nên có phạm vi
Ryan M

1
Tôi đã thử giải pháp tương tự, nhưng vấn đề tôi nhận thấy là nếu sau đó tôi cố gắng thay đổi giá trị của điều khiển trong biểu mẫu, nó vẫn không hợp lệ. Trong trường hợp của tôi, điều khiển đó là một chỉ thị với lựa chọn bên trong. Nếu tôi đặt không hợp lệ cho chỉ thị của mình (là ng-form), thì tôi không thể xóa trạng thái không hợp lệ đó.
Naomi

18

Tôi đã xem qua bài đăng này với một vấn đề tương tự. Cách khắc phục của tôi là thêm một trường ẩn để giữ trạng thái không hợp lệ cho tôi.

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

Trong trường hợp của tôi, tôi có một bool có thể nullable mà một người phải chọn một trong hai nút khác nhau. nếu họ trả lời có, một thực thể sẽ được thêm vào bộ sưu tập và trạng thái của nút sẽ thay đổi. Cho đến khi tất cả các câu hỏi được trả lời, (một trong các nút trong mỗi cặp có một lần nhấp) thì biểu mẫu không hợp lệ.

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

Nó rất đơn giản. Ví dụ: trong bộ điều khiển JS của bạn, hãy sử dụng cái này:

$scope.inputngmodel.$valid = false;

hoặc là

$scope.inputngmodel.$invalid = true;

hoặc là

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

hoặc là

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

Tất cả làm việc cho tôi cho các yêu cầu khác nhau. Hãy đánh nếu điều này giải quyết được vấn đề của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.