$ parsers中的异步函数不会更新$ modelValue

时间:2014-09-25 12:26:16

标签: angularjs

想知道我应该如何处理$parsers中的异步函数。 以下代码不会更新范围。

我使用的是AngularJS 1.2,因此无法使用新的和精彩的1.3功能。

http://plnkr.co/edit/uk9VMipYNphzk8l7p9iZ?p=preview

标记:

<input type="text" name="test" ng-model="test" parse>

指令:

app.directive('parse', function($timeout) {
  return {
    require: 'ngModel',
    link: function(scope, element, attrs, ctrl) {
      ctrl.$parsers.unshift(function(viewValue) {
        $timeout(function() {
          return viewValue;
        });
      });
    }
  };
});

1 个答案:

答案 0 :(得分:0)

如果您正在寻找异步验证功能,我之前做了类似的事情并将其作为库发布。检查custom-remote-validator directive here

基本思路是在从服务器接收验证结果后使用ngModelController $ setValidity。这是指令源代码

.directive('customRemoteValidator', [function () {
    return {
        restrict: 'A',
        require: 'ngModel',
        link: function (scope, elm, attr, ngModelCtrl) {
            var validateFunctionNames = attr["remoteValidateFunctions"].split(",");
            var validatorNames = attr["customRemoteValidator"].split(",");
            ngModelCtrl.$parsers.push(function (value) {
                angular.forEach(validateFunctionNames, function (functionName, index) {
                    if (!scope[functionName]) {
                        console.log('There is no function with ' + functionName + ' available on the scope. Please make sure the function exists on current scope or its parent.');
                    } else {
                        var result = scope[functionName](value);
                        if (result.then) {
                            result.then(function (data) { //For promise type result object
                                ngModelCtrl.$setValidity(validatorNames[index], data);
                            }, function (error) {
                                ngModelCtrl.$setValidity(validatorNames[index], false);
                            });
                        }
                    }
                });
                return value;
            });
        }
    };
}])