我有一个与select
一起使用的指令。它确保绑定到select
的选定对象具有属性。
bxUi.directive('bxHasOwnProperty', function () {
return {
require: 'ngModel',
link: function (scope, element, attrs, modelCtrl) {
function validate(viewValue) {
var prop = attrs.bxHasOwnProperty;
if (viewValue && prop && viewValue[prop] && viewValue[prop] !== "") {
modelCtrl.$setValidity('required', true);
} else {
modelCtrl.$setValidity('required', false);
}
return viewValue;
}
modelCtrl.$parsers.unshift(validate);
modelCtrl.$formatters.push(validate);
}
};
});
示例用法是:
<select name="city" ng-model="city" ng-options="c.name for c in vm.cities" bx-has-own-property="name"></select>
因此,如果用户选择没有名称的城市,required
验证将失败。
我不确定我做得正确的是解析器&amp;验证器使用相同的实现,特别是两者都使用$setValidity
。它有效,但我不确定这是否正确。我正在考虑完全删除modelCtrl.$formatters.push(validate);
,但是当我这样做时,会产生副作用。如果我手动将控制器中的模型设置为没有名称的城市(例如{}
),则required
验证器未设置,我看不到UI反馈。
答案 0 :(得分:0)
您可以在$setValidity
内致电$parsers/$formatters
。但是,在大多数情况下,使用会自动调用modelCtrl.$validators
的{{1}}和modelCtrl.$asyncValidators
个集合就足够了。
试试这个:
$setValidity