在$ formatters中调用$ setValidity

时间:2015-09-24 07:21:36

标签: angularjs angularjs-directive

我有一个与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反馈。

1 个答案:

答案 0 :(得分:0)

您可以在$setValidity内致电$parsers/$formatters。但是,在大多数情况下,使用会自动调用modelCtrl.$validators的{​​{1}}和modelCtrl.$asyncValidators个集合就足够了。

试试这个:

$setValidity