Angular $资源成功回调响应值?

时间:2016-07-07 17:38:54

标签: angularjs angular-promise ngresource

我正在尝试使用$ resource进行REST API交互,并使用以下代码:

内部工厂:

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) {
          }
        });

我收到错误:" TypeError:无法读取属性'然后'未定义"因为$ promise未定义资源对象。

  

问题1:我读过多个可以使用$ promise的问题   写回调的属性。我在这做错了什么   对于用户对象上的登录方法,$ promise属性未定义。

控制器二:

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

这正确处理成功/错误处理,但是在successResult对象上,$ promise还有两个附加属性:undefined,$ resolved:true,而我假设successResponse应该是服务器返回的实际普通对象,但它看起来像$ resource的一个实例。

  

Q2:有没有办法捕获服务器返回的普通对象   使用$ resource时,没有$ resource属性?

对于解决混淆的任何帮助表示赞赏。

1 个答案:

答案 0 :(得分: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>