2016-07-07 2 views
0

Я пытаюсь использовать $ ресурс для взаимодействия API REST с помощью следующего кода:

Внутри завода:

api.user = $resource(api.baseUrl + '/admin/login', {}, { 
      login: {method:'POST'} 
     }); 

один контроллер:

 vm.user.$login().$promise.then(function(successResult) { 
      console.log(successResult); 
     }, function(errorResult) { 
      console.log(errorResult); 
      if(errorResult.status === 404) { 
      } 
     }); 

Я получаю ошибку: «TypeError: Невозможно прочитать свойство 'then' of undefined, поскольку $ object не определено для объекта ресурса.

Question 1: I read on multiple questions that one can use the $promise property to write the callbacks. What am I doing wrong here that the $promise property is coming as undefined for login method on user object.

контроллер Два:

vm.user.$login(function(successResult) { 
      console.log(successResult); 
     }, function(errorResult) { 
      console.log(errorResult); 
      if(errorResult.status === 404) { 
      } 
     }); 

Это правильно обрабатывает обращение успеха/ошибку, однако на объекте successResult, есть два дополнительные свойство $ обещания: не определены, $ Постановили: правда, в то время как я предполагал, что successResponse должен быть фактическим простым объектом, возвращаемым сервером, но он выглядит как экземпляр $ resource.

Q2: Is there a way to capture the plain object returned by the server while using the $resource, not having $resource properties?

Любая помощь для устранения путаницы оценивается.

+0

согласно угловым документам, $ resource retu rns объект, в то время как в ControllerOne вы пытаетесь получить ресурс 'prom' – batmaniac7

+0

$, возвратил объект, который я назначил api.user, а затем я вызываю метод $ login на нем, который, согласно моему пониманию (это не совсем верно) должен возвращать объект ресурса и действительное свойство $ prom, в то время как оно появляется как неопределенное. Надеюсь, это немного объяснит это. – user1242321

+0

@ user1242321, можете ли вы взглянуть в мой ответ? – developer033

ответ

0

Вы можете просто вызвать ваш метод factory так: vm.user.login().$promise.then(function(data) {...

Также вы должны использовать return, как: return $resource(api.baseUrl + '/admin/login', {}, {...

Я сделал фрагмент, проверить его:

(function() { 
 
    "use strict"; 
 
    angular.module('app', ['ngResource']) 
 
    .controller('mainCtrl', function(userFactory) { 
 
     var vm = this; 
 

 
     vm.data = {}; 
 
     vm.login = function() { 
 
     userFactory.login().$promise.then(function(data) { 
 
      vm.data = data.status; 
 
     }, function(data) { 
 
      console.log(data); 
 
     }); 
 
     } 
 
    }) 
 

 
    .factory('userFactory', function($http, $resource) { 
 
    return $resource('http://api.geonames.org/citiesJSON?', {}, { 
 
     login: { 
 
     method: 'POST' 
 
     } 
 
    }); 
 
    }) 
 
})();
<!DOCTYPE html> 
 
<html ng-app="app"> 
 

 
<head> 
 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.7/angular.min.js"></script> 
 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.7/angular-resource.min.js"></script> 
 
</head> 
 

 
<body ng-controller="mainCtrl as main"> 
 
    Response: <pre ng-bind="main.data | json"></pre> 
 
    <hr> 
 
    <button type="button" ng-click="main.login()">Login</button> 
 
</body> 
 

 
</html>