AngularJS:我如何在控制器中手动设置输入为$valid

AngularJS: How do I manually set input to $valid in controller?

本文关键字:设置 输入 valid 控制器 AngularJS      更新时间:2023-09-26

使用TokenInput插件并使用AngularJS内置的formController验证。

现在我试图检查字段是否包含文本,然后设置字段为有效,如果它是。使用插件的问题是,它创建了自己的输入,然后创建了一个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 attr并将模型函数移动到其他地方?

您不能直接更改表单的有效性。如果所有子代输入都有效,则表单有效;如果无效,则表单无效。

你应该做的是设置输入元素的有效性。一样,

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

现在输入(以及表单)是无效的。您还可以查看导致无效的错误。

addItem.capabilities.errors.youAreFat == true;

以上的答案并没有帮助我解决我的问题。经过长时间的搜索,我偶然发现了这个部分解决方案。

我终于解决了我的问题,用这段代码手动设置输入字段为ng无效(设置为ng有效设置为'true'):

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

我在这篇文章中遇到了一个类似的问题。我的解决办法是添加一个隐藏字段来保存我的无效状态。

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

在我的例子中,我有一个可空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>

这很简单。例如:在你的JS控制器中使用this:

$scope.inputngmodel.$valid = false;

$scope.inputngmodel.$invalid = true;

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

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

所有的工作为我不同的要求。

为了使此工作日期错误,我必须先删除错误,然后再调用$setValidity以使表单标记为有效。

delete currentmodal.form.$error.date;
currentmodal.form.$setValidity('myDate', true);