AngularJs,从Interceptor中调用$资源

时间:2015-09-21 22:22:34

标签: angularjs interceptor angular-promise angular-resource

我刚刚放弃了这个。但我有$resource使用query()来检索项目列表。然后,我有一个Interceptor,它遍历这些项目以插入$interval

然后,特定点的$interval将使用$resource get()功能重新获得一个项目。但它的get()无效。

调用发生但我无法将响应返回到模板中。

myServices.factory('Items', ['$resource',
    function($resource) {
        return $resource("/items", {}, {
            'query': {
                interceptor: MyInterceptor,
                url:        "/items",
                isArray:    true
            },
        })
    }]);

myServices.factory('MyInterceptor', function($q, $interval, $injector, $rootScope) {
    return {
        'response': function(response) {
            angular.forEach(response.resource, function (item) {
                 $interval(function () {
                     item.something = 1 + item.something;
                     if(item.something == 10)
                     {                         
                         item = $injector.get("Mine").get({slug: item.id});
                     }
                 });
            });
            return response;
        }
    };
});

我认为这一行item = $injector.get("Mine").get({slug: item.id});可行,但事实并非如此。模板中的新项目未更改。

所以我把它改成了这样的东西,但也没用;

$injector.get("Mine").get({slug: item.id}, function(data){
    item = data;
});

我也试过了$q$promise,但我也没有运气。在这些主题上找到合适的例子也很难。

简而言之......我在$resource中使用了一个拦截器,其中$interval然后需要最终更改{{1}内的值数组中的单个值 - 我怎么能让它工作?

1 个答案:

答案 0 :(得分:0)

简而言之......我在$资源中使用了一个拦截器,带有$ interval,然后需要最终更改$ scope内值数组中的单个值 - 我怎么能让这个工作?

基于上述陈述,我将给出答案。

首先,删除拦截器。你不需要它。而是使用服务。

编写名为ProcessedItems的服务。

angular.module('app')
.service('ProcessedItems', ['Items', '$q', function(Items, $q){
   return {
     query: function() {
       var defer = $q.defer();
       Items.query()
       .$promise
       .then(function(response){
         angular.forEach(response.resource, function(i)){
           i.s = 1 + i.s;
           if(i.s == 10) {                         
             i = $injector.get("Mine").get({slug: i.id});
             i.$promise.then(function(){
                defer.resolve(response);
             }, function(){
                defer.reject();
             });
           };
         };
       });
       return defer.promise;
     }
   };
}]);

设置此服务后,您可以在控制器中执行

angular.module('app')
.controller('AppController', ['$scope', 'ProcessedItems', 
function($scope, ProcessedItems){
  $scope.items = [];
  ProcessedItems.query().then(function(pitems){
    $scope.items = pitems;
  });
});

这基本上要做的是首先完全处理数据,然后在视图中显示它。