2014-09-25 61 views
2

想知道如何处理$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; 
     }); 
     }); 
    } 
    }; 
}); 
+0

你能详细介绍一下你的场景吗?你可以调用$ setViewValue(value);模型控制器更新模型数据,但输入内容不变。 – Chandermani 2014-09-25 12:58:09

+0

你不能那样做。你能否摆脱更多的背景? – PSL 2014-09-25 13:01:01

+0

这是一个指令,用于对输入值的可用性进行异步查找。我基本上想从角度v1.3 $ asyncValidators,但我坚持与v1.2 :( 我有一个“解决方法”,但想知道如何正确处理这个问题:) 解决方法是刚刚返回viewValue无论如何。所以'function(viewValue){validatorAsync(viewValue);返回viewValue; }' – 2014-09-25 13:21:31

回答

0

如果您正在寻找异步验证功能,我不喜欢的东西,前一段时间和释放它作为一个图书馆。检查自定义远程验证器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; 
      }); 
     } 
    }; 
}])