如何获取ngResource查询[object object]

时间:2016-03-16 11:47:28

标签: javascript angularjs ionic-framework

我正在尝试使用ngresource查询方法获取内容。

我有这样的工厂

    .factory('factoryName', ['$resource','API_URL', function ($resource,API_URL) {
return $resource(
    API_URL+'route1/route2/:userId',{userId: '@_userId'},
    {            
        update: {method: 'PUT'},
        query:{method:'GET'}
    }

);
}])

我的控制器看起来像这样

  .controller('myCtrl',function($scope,$http,factoryName,userService){
   $scope.userId = userService.getUser().userId;
    $scope.result  =factoryName.query({userId:$scope.userId})
   console.log($scope.result)

  }) 

我发现,那是记录[对象对象],同时当我在网络中跟踪响应时,它运行良好并且响应我想要的结果。但我的$ scope.result是[object object]。我尝试了无数的技巧来获取[对象]的内容,但我不能。

我也试过

    .controller('myCtrl',function($scope,$http,factoryName,userService){
       $scope.userId = userService.getUser().userId;
        factoryName.query({userId:$scope.userId},
         function(response){
        $scope.result = response
       console.log(response)
      })
    }) 

甚至没有给我任何东西。

我刚才意识到,响应显示在视图中

  <div ng-app="myApp">
   <div ng-controller="myCtrl">

      <h2>{{result.something}}</h2>

   </div>
</div>

但是,我不知道为什么它没有正确登录控制台

4 个答案:

答案 0 :(得分:0)

您的代码中存在一些问题。

首先,angular-resource是异步的。这意味着

$scope.userId = userService.getUser().userId;
$scope.result  =factoryName.query({userId:$scope.userId})

这不起作用。

你应该这样做:

$scope.user = userService.getUser();
$scope.user.$promise.then(function(user) {
    $scope.result = factoryName.query({userId:user.userId})
})

答案 1 :(得分:0)

Angular ng-resource查询是异步的 - 它创建空数组(而不是加载数据),并提供$ promise属性,其中包含在数据加载完成时解析的promise。正确的方法是

$scope.result = factoryName.query({userId:$scope.userId});
$scope.result.$promise.then(function() {
    console.log($scope.result);
});

此外,正如在其他答案中提到的那样,用户负载也会发生同样的情况

答案 2 :(得分:0)

对远程服务器的所有调用都是以异步方式完成的,因此您无法将结果同步分配给范围变量。有两种方法可以解决这个问题。

https://docs.angularjs.org/api/ngResource/service/$resource

通过回调函数:

select
id,
id as row_num,
A.date_created,
(select
        payment_amount
    from ap_form_payments
    where form_id = '10242' and record_id = A.id
    order by afp_id desc
    limit 1) payment_amount,
ifnull((select
        payment_status
    from
        ap_form_payments
    where
        form_id = '10242' and record_id = A.id
    order by afp_id desc
    limit 1),
    'unpaid') payment_status,
(select
    payment_id
from
    ap_form_payments
where form_id = '10242' and record_id = A.id
order by afp_id desc
limit 1) payment_id
from ap_form_10242 A
join ap_form_payments
on A.id = ap_form_payments.afp_id
WHERE A.status = 1
order by payment_method asc
LIMIT 0 , 15;

另一个(首选)选项是使用稍后为$ resource服务引入的$scope.userId = userService.getUser( function(user) { $scope.userId = user.userId } );

$promise

答案 3 :(得分:0)

您的代码对我来说很好。我猜测控制台正在通过在记录它之前调用响应对象上的toString()来播放一个技巧。

尝试通过序列化来验证对象内容:scanf()

修改

您必须为query()提供回调,第一个回调用于成功操作,第一个参数是查询数据,第二个回调用于不成功操作。 Here's a fiddle for you:)