2016-07-07 7 views
0

Ich versuche, die $ Ressource für REST API Interaktion mit folgendem Code zu verwenden:

Innen Factory:

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

Controller-One:

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

ich den Fehler: „Typeerror: Die Eigenschaft 'then' von undefined kann nicht gelesen werden, da das $ promise für das Ressourcenobjekt nicht definiert ist.

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.

zwei Controller:

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

Diese Prozesse ordnungsgemäß den Erfolg/Fehlerbehandlung, jedoch auf dem SUCCESS Objekt gibt es zwei zusätzliche Eigenschaften von $ Versprechen: undefined, $ aufgelöst: true, während ich ging davon aus, dass rescueResponse das tatsächliche einfache Objekt sein sollte, das vom Server zurückgegeben wird, aber es sieht wie eine Instanz von $ resource aus.

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

Jede Hilfe, um die Verwirrung zu beheben, wird geschätzt.

+0

nach Angular Docs, die $ Ressource retu rns ein Objekt, während Sie in ControllerOne versuchen, eine "Versprechen" – batmaniac7

+0

$ Ressource erhalten ein Objekt, das ich zugeordnet api.user und dann rufe ich die $ Login-Methode darauf, die nach meinem Verständnis (nicht korrekt sein kann) sollte ein Ressourcenobjekt und eine gültige $ promise-Eigenschaft zurückgeben, solange es nicht definiert ist. Ich hoffe das klärt es ein bisschen auf. – user1242321

+0

@ user1242321, können Sie einen Blick in meine Antwort werfen? – developer033

Antwort

0

Sie können einfach Ihre factory Methode, um diese Art und Weise nennen: vm.user.login().$promise.then(function(data) {...

Sie auch benötigen return zu verwenden, wie die folgenden: return $resource(api.baseUrl + '/admin/login', {}, {...

ich einen Ausschnitt aus, überprüfen Sie es:

(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>

Verwandte Themen