在自定义解析器

时间:2015-09-16 21:05:56

标签: javascript angularjs angular-resource angular-directive

我正在开发一个angular指令,它实现了一个解析器,通过点击服务器来验证当前输入,服务器返回一个true / false状态,我必须使用它:

  1. 使模型无效
  2. 将模型值设置为' undefined'当它无效时
  3. 我已经通过使用$ 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上缺失,因为我们无法从函数内部返回到外部函数,但无法找到解决方案。

    非常感谢任何帮助!

    plunker

1 个答案:

答案 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。这是另一项服务,允许您推迟在其他地方使用的已解决或被拒绝的承诺。