验证ng-repeat中的变量列表

时间:2017-11-16 13:46:23

标签: angularjs

In this plunk我有ng-repeat个输入字段。每个字段必须传递两个验证:(1)值不能为空,(2)如果num = 1则值必须为数字。我在每行中使用ng-form来独立验证值(我ng-repeat内不能有<form>

问题是邮件显示不正确。要复制,in the plunk1添加到第三个字段。它变为b1不是有效数字,但仍未显示Value should be a number错误消息。再次更改值后会显示,例如b11。问题在哪里以及如何解决?

HTML

<div ng-repeat="v in vals">
  <ng-form name="formval">
      <input type="text" name="val" ng-model="v.val" style="float:left" 
            ng-change="seeError(formval,v.num,v.val)" required/>
      <div ng-show="!formval.val.$valid" ng-messages="formval.val.$error" class="errorMsg">
           <div ng-message="shouldBeNumber">Value should be a number</div>
           <div ng-message="required">Value cannot be empty</div>
      </div> 
      {{ 'error row #' + $index}} {{formval.val.$error}}
      <br/><br/><br/>
    </ng-form>
 </div>

的Javascript

var app = angular.module('app', []);

app.controller('ctl', function ($scope) {

    $scope.vals = [
      {val: 'a', num: 0},
      {val: 2, num: 1 },
      {val: 'b', num: 1}
    ];


    $scope.seeError = function(form,num,value){
          delete form.val.$error.shouldBeNumber;
          if (value && value.trim()==="") // omit as form will show an error
              return;
          if (num===1) // should be a number
              if (isNaN(parseFloat(value)))
                  form.val.$error.shouldBeNumber = true;
    };

});

3 个答案:

答案 0 :(得分:2)

我改变了你的一些代码。

请检查这个小提琴。

form validation

from openpyxl import load_workbook
import os
from os.path import exists

target_file = input('ex)201711 ')
wb = load_workbook(target_file + '.xlsm', data_only=True)
sheet = wb['summary']
num_people = len(sheet['A:A'])

for i in range(1, num_people):
    val_1 = sheet.cell(row=i + 1, column=1).value
    val_2 = sheet.cell(row=i + 1, column=2).value
    val_3 = sheet.cell(row=i + 1, column=3).value

    file_name = '2017(' + val_1 + ').xlsx'
    if not exists(file_name):
        continue
    else:
        wb = load_workbook(file_name, data_only=True)
        sheet2 = wb['summary2']

        sheet2.cell(row=1, column=1).value = val_1
        sheet2.cell(row=1, column=2).value = val_2
        sheet2.cell(row=1, column=3).value = val_3
        wb.save(file_name)

我不确定我的小提琴是否适合你的目的,

但我希望这可以帮到你。 :)

答案 1 :(得分:2)

你应该先修复一些错误:

1)将此添加到 head -tag

vendor/

2)和JS

<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular-messages.js"></script>

...然后

in html

var app = angular.module('app', ['ngMessages']);
JS中的

<input type="text" name="val" ng-model="v.val" style="float:left" required ng-model-sniffer/>
<div ng-messages="formval.val.$error" class="errorMsg">
    <div ng-message="shouldBeNumber">Value should be a number</div>
    <div ng-message="required">Value cannot be empty</div>
</div>

答案 2 :(得分:1)

当列表最初显示时,因为

而未触发更改
  

只有在输入发生变化时才会评估ngChange表达式   value会将新值提交给模型。

     

不会评估:

     
      
  • 如果$ parsers转换管道返回的值未更改
  •   
  • 如果输入继续无效,因为模型将保持为空
  •   
  • 如果以编程方式更改模型,而不是通过更改输入值
  •   

您可以使用自定义过滤器来实现相同的行为

HTML

<div ng-repeat="v in vals | filter:checkError">
</div>

JS

$scope.checkError = function (item) {

    if(item.val is not number)
        displayError = true;

    return true;
};