AngularJS: Як мені вручну встановити для введення значення $ valid у контролері?


92

Використовуючи плагін TokenInput та використовуючи вбудовану перевірку форми AngularJS formController.

Зараз я намагаюся перевірити, чи містить поле поле, а потім встановити його як дійсне, якщо воно містить. Проблема використання плагіна полягає в тому, що він створює власний вхід, а потім 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;
  }
};

Я запускаю функцію capabilityValidation, коли TokenInput щось вводить і передає в об'єкт.

РЕДАГУВАТИ:

З'ясувавши, що ng-model на моєму вводі робить щось і отримує результати автозавершення, саме тому я не можу отримати ng-valid для роботи, оскільки вона базується на моделі.

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

Я не писав цю реалізацію автозаповнення, чи є інший спосіб зробити це, де я мав би доступ до ng-model attr і переміщував функцію моделі кудись ще?


1
Оскільки ваш плагін створює власний ввід, і у вас є функція для власної перевірки, чому б просто не використовувати власне властивість $ scope для перевірки: <div ... data-ng-show="capabilities_error" ...> Іншими словами, чи є причина, за якою ви хочете / потрібно використовувати FormController?
Mark Rajcok

2
Оскільки всі інші мої форми використовують його, я хотів би зберегти контроль, який він дає. Створений плагін введення фактично встановлює значення в моєму вихідному вході, яке мені потім потрібно перевірити проти моєї перевірки, але він не оновлює formController, коли є введене значення.
Крістофер Маршалл

Я спеціально скоротив розмітку, щоб ізолювати вхід. У мене є набагато більше даних у цій самій формі.
Крістофер Маршалл

1
Добре. Ви намагалися addItem.capabilities.$valid = trueта / або встановити addItem.capabilities. $ Error.required як true або false, як відповідно?
Mark Rajcok

Я спробував обидва ці. Я оновлю своє запитання, щоб показати вам. $ Valid та $ error.required відображаються як невизначені на моїй точці зупинки в контролері, але addItem.capabilities все ще має дані.
Крістофер Маршалл

Відповіді:


150

Ви не можете безпосередньо змінити дію форми. Якщо всі вхідні дані вхідні, вірна форма, якщо ні, то це не так.

Що вам слід зробити, це встановити дійсність вхідного елемента. Подобається так;

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

Тепер введення (і тому форма) недійсне. Ви також можете побачити, яка помилка спричиняє недійсність.

addItem.capabilities.errors.youAreFat == true;

1
Що робити, якщо capabilitiesце змінна? У мене є масив, що містить імена вхідних даних, і я хочу зациклюватися всередині масиву та встановити їх недійсними по одному: /
lightalex

1
Що ви маєте на увазі під змінною? Він безпосередньо прив’язаний до самої форми, а не до значень у формі. Він використовує nameатрибут форми та атрибут input id. Це відрізняється від значень, встановленихngModel
Umur Kontacı

11
Я знайшов рішення, але мав на увазі саме це:$scope.addItem['myVariableName'].$setValidity("youAreFat", false);
lightalex

Після цього виявляється, що деякі поля введення більше не перевіряються на зміну чи розмиття
Леонардо

4
У кутовій версії 1.4.7, і мені довелося додати до цього коду префікс $ scope ..$scope.addItem.capabilities.$setValidity("youAreFat", false);
Грем Т

60

Відповіді вище не допомогли мені вирішити мою проблему. Після довгих пошуків я наткнувся на це часткове рішення .

Нарешті я вирішив свою проблему з цим кодом, щоб вручну встановити поле введення на ng-invalid (щоб встановити на ng-valid встановити його на "true"):

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

3
Я зробив те саме, і це працює без проблем. Але зараз у мене є деякі проблеми з повторною перевіркою того самого поля. Це не змінюється на змінений стан, що дуже дратує. Я використовую ng-model-options = "{updateOn: 'submit'}" для перевірки при натисканні на кнопку. Будь-які думки з цього приводу?
OliverKK

1
@OliverKK вам потрібно викликати $setValidityз в trueякості другого параметра , коли вхід є дійсним.
Бернхард Хофманн,

10
не має сенсу використовувати rootcope, це має бути просто сфера дії
Райан М

1
Я спробував подібне рішення, але виявлена ​​проблема полягає в тому, що якщо я спробую змінити значення елемента керування у формі, воно залишається недійсним. У моєму випадку цей контроль - це директива з внутрішнім вибором. Якщо я встановив недійсний для моєї директиви (яка є ng-формою), то я не можу видалити цей недійсний статус.
Наомі

18

Я натрапив на цю публікацію з подібною проблемою. Моє виправлення полягало в тому, щоб додати приховане поле, яке містило б мій недійсний стан для мене.

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

Все працює для мене за різними вимогами. Будьте готові, якщо це вирішить вашу проблему.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.