Используйте возвращаемое значение $resource внутри пользовательского парсера

Я работаю над директивой angular, которая реализует синтаксический анализатор для проверки текущего ввода, нажимая на сервер, сервер возвращает статус в true/false, который я должен использовать для:

  1. Сделать модель недействительной
  2. Установите значение модели на «неопределенное», если оно недействительно

Я выполнил 1. выше, используя $setValidity, но имею проблему в 2. потому что мне нужно использовать статус, возвращаемый сервером функции $parser, но поскольку я должен ждать ответа сервера, оператор return внутри обратного вызова бесполезно.

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, поскольку мы не можем вернуться изнутри функции к внешней функции, но не смогли найти решение.

Любая помощь приветствуется!

плункер


person Narain Mittal    schedule 16.09.2015    source источник


Ответы (1)


$resource — это фабрика, и, как и $http, она может возвращать $promise. Следовательно, когда вы возвращаете переменную modelval, вы возвращаете ее до того, как будет возвращено обещание обновить эту переменную. Вы должны сделать следующее:

 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. Это еще один сервис, который позволяет отложить выполненные или отклоненные обещания для использования в другом месте.

person lnyman    schedule 19.09.2015
comment
ваше решение, похоже, не работает, хотя обратный вызов выполняется правильно, но возвращаемое значение не обновляет модель, и хотя result.status является ложным, я ожидаю, что окончательное значение модели будет «неопределенным» вместо «123» . Я обновил планку с вашим решением. Пожалуйста, взгляните. - person Narain Mittal; 24.09.2015