1

我必须使用指令验证表单,以便 AngularJS 能够启用或禁用提交表单按钮。

我在 jQuery 中有一个函数,但我需要 AngularJS 监视这种行为。

此功能比较输入以防止每个输入中的重复信息。

<form id="myform">
<table>
    <tr>
        <td><input name="currency1" class="required" unique="currency"/></td>
    </tr>
    <tr>
        <td><input name="currency2" class="required" unique="currency"/></td>
    </tr>
    <tr>
        <td><input name="currency3" class="required" unique="currency"/></td>
    </tr>
    <tr>
        <td><input name="currency4" class="required" unique="currency"/></td>
    </tr>
</table>

这是功能

jQuery.validator.addMethod("unique", function(value, element, params) {
     var prefix = params;
     var selector = jQuery.validator.format("[name!='{0}'][name^='{1}'][unique='{1}']", element.name, prefix);
     var matches = new Array();
     $(selector).each(function(index, item) {
         if (value == $(item).val()) {
             matches.push(item);
         }
     });

     return matches.length == 0;
          }, 
       "Valor Repetido"
     );


     jQuery.validator.classRuleSettings.unique = {
          unique: true
     };

     $("#myform").validate();

     $("#validate").onBlur(function() {
          $("#myform").valid();
     });

和 CSS

label.error { color: red }

谁能帮我?

4

1 回答 1

1

你可以有一个对象数组来保存所有的值,并深入观察它。
在控制器中:

$scope.currencies =
    [{'value':'val1'},{'value':'val2'},{'value':'val1'} ];

$scope.$watch('currencies', function(){
    $scope.duplicates = false;
    var found = [];
    $scope.currencies.forEach(function(currency){
        if(!(found.indexOf(currency.value)+1))
            found.push(currency.value);
        else $scope.duplicates = true;
    });
},true); //The 'true' last parameter is the signal to deep watch.

表中的每个输入都绑定ng-model到一个对象,$scope.currencies以便深度监视将立即看到任何更改。ng-repeat您可以使用指令生成输入列表:

<tr ng-repeat="currency in currencies">
    <td><input type="text" ng-model="currency.value"></input></td>
</tr>

然后对于提交按钮,有<input type="submit" ng-disabled="duplicates"></input>

如果你愿意,你可以添加按钮来添加或删除元素$scope.currencies,它会立即反映在视图中。

Plunker 样品

于 2015-11-25T20:07:42.857 回答