AngularJS验证表单数组长度

gri*_*ett 3 javascript validation angularjs

假设我有一个带有属性的模型对象 favoriteColors

{
    ...
    favoriteColors: ['red', 'green', 'blue']
    ....
}
Run Code Online (Sandbox Code Playgroud)

我用ng-repeat将它们暴露给用户

<form name="userForm">
    ...
    <ul>
        <li ng-repeat="color in user.favoriteColors">
            <input type="text" ng-model="color" />
            <a href="" ng-click="delete(color)">remove</a>
        </li>
    </ul>
    <a href="" ng-click="add()">Add a new favorite color</a>
    ...
</form>
Run Code Online (Sandbox Code Playgroud)

我希望能够检查favoriteColors字段的有效性做这样的事情

<div ng-show="userForm.favoriteColors.$error">
    You must have at least one favorite color
</div>
Run Code Online (Sandbox Code Playgroud)

使用内置的验证器似乎不可能做到这一点,我不确定我会在哪个元素上放置自定义指令以获取ngModelControllerfor favoriteColors.

小智 13

我的解决方案是添加一个隐藏的输入标记和绑定数组的长度

    <form name="userForm">
      ...
      <ul>
        <li ng-repeat="color in user.favoriteColors">
          <input type="text" ng-model="color" />
          <a href="" ng-click="delete(color)">remove</a>
        </li>
      </ul>
      <a href="" ng-click="add()">Add a new favorite color</a>
      ...

      <!-- new line -->
      <input style="display:none" name="colorsLength" type="number" min=1 value="{{user.favoriteColors.length}}"/>
    </form>
Run Code Online (Sandbox Code Playgroud)

因此,您可以使用userForm.colorsLength.$ error进行验证.祝好运!


小智 11

@Loi Pham,遗憾的是我不允许评论,所以我必须添加帖子.我喜欢你的方法.但是我必须在输入中添加ng-model以使验证工作:

<input style="display: none" type="number" name="length" readonly ng-model="colors.length" min="1">
Run Code Online (Sandbox Code Playgroud)