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

时间:2013-03-15 16:27:03

标签: javascript validation angularjs

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

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

5 个答案:

答案 0 :(得分:140)

您无法直接更改表单的有效性。如果所有后代输入都有效,则表单有效,否则表示不是。

您应该做的是设置输入元素的有效性。像这样;

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

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

addItem.capabilities.errors.youAreFat == true;

答案 1 :(得分:54)

上面的答案并没有帮助我解决问题。经过长时间的搜索后,我碰到了partial solution

我终于通过此代码解决了我的问题,手动将输入字段设置为ng-invalid(设置为ng-valid,将其设置为&#39; true&#39;):

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

答案 2 :(得分:18)

我遇到过类似问题的帖子。 我的修复是添加一个隐藏字段来保存我的无效状态。

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

答案 3 :(得分:1)

这很简单。例如 : 在您的JS控制器中使用以下代码:

$scope.inputngmodel.$valid = false;

$scope.inputngmodel.$invalid = true;

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

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

根据不同的要求,所有这些作品对我来说都是如此。如果可以解决您的问题,请点击。

答案 4 :(得分:0)

要使此日期错误有效,我必须在调用$ setValidity以将表单标记为有效之前先删除该错误。

delete currentmodal.form.$error.date;
currentmodal.form.$setValidity('myDate', true);
相关问题