我试图创建一个指令,当一个控件的值发生更改时,该指令可用于重置组中多个输入控件的验证状态。组由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">
它可以重置自己的输入控件的有效性,但不能使用指令和相同的属性值访问其他输入控件。通过查询具有相同属性的输入来访问其他控件的最佳角度方式是什么?
答案 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();
});
}
};
});
答案 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
事件,忘记在元素被破坏后忘记删除控制器。