设置AngularJS指令的多个输入的有效性

时间:2015-05-23 06:59:23

标签: angularjs angularjs-directive

我试图创建一个指令,当一个控件的值发生更改时,该指令可用于重置组中多个输入控件的验证状态。组由HTML中指令集的属性标识。 例如: - 当用户更改其中一个控件输入值时,从日期到日期输入都会重置有效状态

这是我到目前为止所拥有的

JS /角

angular.module('myModule').directive('groupedInputs', function () {
    return {
        restrict: 'A',
        require: '?ngModel',
        link: function (scope, element, attrs, ctrl) {
            element.on('change', function () {

                // Resetting own validity
                scope.$apply(ctrl.$setValidity('server', true));

                // Here I need to set the validity of the controls which
                // have the `GroupedInputs` directive with the 
                // same  attribute value
            });
        }
    };
});

HTML

<input name="FromDate" type="date" class="form-control" ng-model="model.FromDate" grouped-inputs="FromToDates">
<input name="ToDate" type="date" class="form-control" ng-model="model.ToDate" grouped-inputs="FromToDates">

它可以重置自己的输入控件的有效性,但不能使用指令和相同的属性值访问其他输入控件。通过查询具有相同属性的输入来访问其他控件的最佳角度方式是什么?

2 个答案:

答案 0 :(得分:5)

我会尝试通过实现帮助对象来存储组元素控制器,并使用添加到组的方法和组中所有元素的setValidity来解决此问题。

这样的事情:

angular.module('myModule').directive('groupedInputs', function() {

    var groupControls = {
        groups: {},
        add: function(name, ctrl) {
            this.groups[name] = this.groups[name] || [];
            this.groups[name].push(ctrl);
        },
        setValidity: function(name, key, value) {
            this.groups[name].forEach(function(ctrl) {
                ctrl.$setValidity(key, value);
            });
        }
    };

    return {
        restrict: 'A',
        require: '?ngModel',
        link: function(scope, element, attrs, ctrl) {

            // Add element controller to the group
            groupControls.add(attrs.groupedInputs, ctrl);

            element.on('change', function() {

                // When needed, set validity of elements in the group
                groupControls.setValidity(attrs.groupedInputs, 'server', false);
                scope.$apply();

            });
        }
    };
});

演示: http://plnkr.co/edit/fusaaN6k9J5SZ7iQA97V?p=preview

答案 1 :(得分:1)

您可以将具有相同组的所有控制器存储在一个数组中:

angular.module('myModule').directive('groupedInputs', function () {
    var controllersPerGroup = {};

    return {
        restrict: 'A',
        require: '?ngModel',
        link: function (scope, element, attrs, ctrl) {
            var groupName = attrs.groupedInputs;
            var group = controllersPerGroup[groupName];
            if (!group) {
                group = [];
                controllersPerGroup[groupName] = group;
            }
            group.push(ctrl);

            element.on('change', function () {

                // Resetting own validity
                scope.$apply(ctrl.$setValidity('server', true));

                // all the other controllers of the same group are in the groups array.
            });
        }
    };
});

通过收听$destroy事件,忘记在元素被破坏后忘记删除控制器。