想知道我应该如何处理$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 :(得分: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;
});
}
};
}])