我正在开发一个angular指令,它实现了一个解析器,通过点击服务器来验证当前输入,服务器返回一个true / false状态,我必须使用它:
我已经通过使用$ setValidity完成了1.但是在2.中遇到问题因为我需要使用服务器返回到$ parser函数的状态,但是因为我必须等待服务器响应,所以返回语句内部回调是没用的。
app.directive('testDir', ['$resource',function($resource){
return{
restrict:'A',
require:'ngModel',
scope:{},
link:function(scope,element, attr,ngModel){
ngModel.$parsers.push(function (inputValue) {
var req=$resource('data.json');
var modelval='123';
req.get({},function(result){
ngModel.$setValidity('id',result.status);
//ngModel.$setViewValue(result.name);
console.log(result.name);
modelval=result.status?inputValue:undefined;
return modelval; // this doesn't work
});
return modelval; // executes before reading the JSON so always '123'
});
}
};
我觉得我在一些非常基本的JS上缺失,因为我们无法从函数内部返回到外部函数,但无法找到解决方案。
非常感谢任何帮助!
答案 0 :(得分:0)
$resource
是一家工厂,与$http
非常相似,可以返回$promise
。因此,当您返回变量modelval
时,在返回promise之前返回它以更新此变量。您应该执行以下操作:
var req=$resource('data.json');
var modelval='123';
req.get({}).$promise.then(function(result){
ngModel.$setValidity('id',result.status);
//ngModel.$setViewValue(result.name);
console.log(result.name);
modelval=result.status?inputValue:undefined;
return modelval; // this will update if the request is a success
}, function(error){
//error handling should go here
});
return modelval; // this will still execute before reading the JSON so will always return '123'
});
如果您想在其他地方使用承诺的回报,您应该考虑使用$q
。这是另一项服务,允许您推迟在其他地方使用的已解决或被拒绝的承诺。