获取请求后$ resource对象为空

时间:2017-03-25 16:26:09

标签: angularjs angular-resource ngresource

我想在$ scope变量中保存来自Rest-API的JSON-Data以供进一步使用。 问题是代码执行时,我在Firebug中看到我已成功获得JSON数据,但问题是,我无法将其保存在我的Scope变量中,我不知道原因。

我的app.js

var app = angular.module('shop', ['ngRoute','ngResource'])
  .factory('Customerservice', function ($resource) {
      return $resource('http://localhost:8080/Shop/:customer',{customer: "@customer"});
})
  .config(function ($routeProvider, $locationProvider) {
      $routeProvider.when('/name/:ID', {
          templateUrl : "Customer/customers.html",
          controller : 'customerController'
      });
})
  .controller('customerController', function ($scope,Customerservice) {
      $scope.customerinfo = Customerservice.get({customer: "Mark"});
      alert($scope.customerinfo);
});

就像我说的那样,我已经获得了JSON-Data,但问题出在我的Controller" customerController"中。我只是将警报功能放在我的代码中,以查看我的$ scope.customerinfo中的内容。而且,customerinfo的内容只是对象:对象。 我在使用Firebug进行重组时注意到了一些奇怪的事情。看起来警报是在get请求之前执行的。这可以解释为什么我的$ scope变量中没有数据。任何人都可以帮助我。

2 个答案:

答案 0 :(得分:2)

使用$ promise属性

重要的是要意识到调用$resource对象方法会立即返回一个空引用(对象或数组,具体取决于isArray)。从服务器返回数据后,将使用实际数据填充现有引用。

$scope.customerinfo = CustomerService.get({customer: "Mark"});

console.log($scope.customerinfo); //Empty object

但是,$resource服务还附加了$promise属性,该属性可用于延迟代码执行,直到数据从服务器到达:

$scope.customerinfo = CustomerService.get({customer: "Mark"});
console.log($scope.customerinfo); //Empty object

//USE $promise
$scope.customerinfo.$promise
  .then(function(info) {
    console.log($scope.customerinfo); //Fulfilled object
    return info;
}).catch(function(errorResponse) {
    console.log(errorResponse.status);
    throw errorResponse;
});
  

资源实例和集合具有以下附加属性:

     
      
  • $promise:创建此实例或集合的原始服务器交互的promise
  •   
     

成功时,使用相同的资源实例或集合对象解析promise,并使用来自服务器的数据进行更新。这使得在resolve section of $routeProvider.when()中使用它很容易推迟视图渲染,直到资源被加载。

     

失败时,使用http response对象拒绝承诺,但不包含resource属性。

     

— AngularJS ngResource $resource API Reference

答案 1 :(得分:1)

$resource是async api所以你无法从函数调用的直接返回中获取值,它包含一个变量$promise,它将返回promise所以你需要调用{{1}它的功能

试试这个

then