Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用ngResource解决服务中的业务处理_Javascript_Angularjs_Angular Promise_Ngresource - Fatal编程技术网

Javascript 使用ngResource解决服务中的业务处理

Javascript 使用ngResource解决服务中的业务处理,javascript,angularjs,angular-promise,ngresource,Javascript,Angularjs,Angular Promise,Ngresource,我有一个AngularJs应用程序,它使用组件和几个模块。我创建了一个plunker示例来说明我的问题 我有我的NavbarComponent,我在其中声明了我的控制器,我在其中注入了名为NavbarService的服务。 在NavbarService中,我注入一个工厂资源来进行Rest调用,一旦调用完成,我将尝试在将响应返回控制器之前对其进行一些处理,在本例中,我只对其应用一个简单的过滤器,但它不起作用。如果我省略了我的处理,只返回类别,代码就会工作,您可以可视化一个包含两个类别的列表 我可以

我有一个AngularJs应用程序,它使用组件和几个模块。我创建了一个plunker示例来说明我的问题

我有我的NavbarComponent,我在其中声明了我的控制器,我在其中注入了名为NavbarService的服务。 在NavbarService中,我注入一个工厂资源来进行Rest调用,一旦调用完成,我将尝试在将响应返回控制器之前对其进行一些处理,在本例中,我只对其应用一个简单的过滤器,但它不起作用。如果我省略了我的处理,只返回类别,代码就会工作,您可以可视化一个包含两个类别的列表

我可以在控制器中进行处理,但这是一种不好的做法,因为我认为应该在服务中进行处理,其次,由于这是一种异步响应,我必须这样做才能使其工作,这真的很难看:

    navbarService.getCategories().$promise.then(function (response) {
                console.log("controller", response[0].category);
                vm.categories = categoryFilter(response[0].category);
            }, function (error) {
               console.log("an error occured");
            });

有人能给我指点迷津吗,我没有办法了。谢谢你

你的过滤器应该是这样的,它应该在$resource query的transformResponse中调用,而不是在service中调用,我希望这会对你有所帮助

'use strict';

 angular.module('navbar').filter('category', function() {
  return function(categories) {
    var categoryIds = ['World'];
    var result = [];
    angular.forEach(categoryIds, function (categoryId) {
        angular.forEach(categories, function (category) {
            if (category.name == categoryId) { 
              console.log("Match"); 
                result.push(category);
            }
        });
    });
    return result;
   };
 });
您的categoryResource.service应该是这样的

 angular.module('shared').factory('categoryResourceService', 
   ['$resource','categoryFilter', function($resource, categoryFilter) {
     var provider = "categories.json"; 
     var params = { 
               id: '@id'
           };
     return $resource(provider, params, {
         query: {
           isArray: true,
           method: 'GET',
           params: {},
           transformResponse: function(categories) { 
                var results = categoryFilter(angular.fromJson(categories));  
                console.log("[categoryResourceService] filtered response:", results);
                return results;
           }
        }
    });
 }]);
'use strict';

angular.module('navbar').component('appNavbar', {
   templateUrl: "navbar.template.html",
   controller: [ 'navbarService', function appNavbarController(navbarService) {
   var vm = this; 
   vm.categories = navbarService.getCategories();
 }]
});
 'use strict';

angular.module('navbar').component('appNavbar', {
     templateUrl: "navbar.template.html",
     controller: [ 'navbarService', function appNavbarController(navbarService) {
         var vm = this; 
         navbarService.getCategories(function(data){
             // this will be called when service will get the response and filter function has filtered the response
             vm.categories = data;
         });
      }]
}); 
 'use strict';

angular.module('navbar').service('navbarService', ['categoryResourceService', 'categoryFilter', function(categoryResourceService, categoryFilter) {
var vm = this;
vm.getCategories = function(callback) {
  categoryResourceService.query(function(response) {
    console.log("[NavbarService] response:", response);
    callback(categoryFilter(response));
  }, function(error) {
    console.log("[NavbarService] error:", error);
  });
  //return vm.categories;  
}

}]);
  'use strict';

  angular.module('navbar').filter('category', function() {
   return function(categories) {
    var categoryIds = ['World'];
    var result = [];
     angular.forEach(categoryIds, function (categoryId) {
     angular.forEach(categories, function (category) {
          if (category.name == categoryId) { 
             console.log("Match"); 
             result.push(category);
          }
      });
    });
   return result;
  };
});
服务应该是这样简单

 'use strict';

angular.module('navbar')
.service('navbarService', [ 'categoryResourceService', function (categoryResourceService) {
    var vm = this; 
vm.getCategories = function(){
  vm.categories = categoryResourceService.query(function(response){
    console.log("[NavbarService] response:", response); 
  }, function(error){
    console.log("[NavbarService] error:", error);
  });
  return vm.categories;  
 }

}]);
还有像这样的组件

 angular.module('shared').factory('categoryResourceService', 
   ['$resource','categoryFilter', function($resource, categoryFilter) {
     var provider = "categories.json"; 
     var params = { 
               id: '@id'
           };
     return $resource(provider, params, {
         query: {
           isArray: true,
           method: 'GET',
           params: {},
           transformResponse: function(categories) { 
                var results = categoryFilter(angular.fromJson(categories));  
                console.log("[categoryResourceService] filtered response:", results);
                return results;
           }
        }
    });
 }]);
'use strict';

angular.module('navbar').component('appNavbar', {
   templateUrl: "navbar.template.html",
   controller: [ 'navbarService', function appNavbarController(navbarService) {
   var vm = this; 
   vm.categories = navbarService.getCategories();
 }]
});
 'use strict';

angular.module('navbar').component('appNavbar', {
     templateUrl: "navbar.template.html",
     controller: [ 'navbarService', function appNavbarController(navbarService) {
         var vm = this; 
         navbarService.getCategories(function(data){
             // this will be called when service will get the response and filter function has filtered the response
             vm.categories = data;
         });
      }]
}); 
 'use strict';

angular.module('navbar').service('navbarService', ['categoryResourceService', 'categoryFilter', function(categoryResourceService, categoryFilter) {
var vm = this;
vm.getCategories = function(callback) {
  categoryResourceService.query(function(response) {
    console.log("[NavbarService] response:", response);
    callback(categoryFilter(response));
  }, function(error) {
    console.log("[NavbarService] error:", error);
  });
  //return vm.categories;  
}

}]);
  'use strict';

  angular.module('navbar').filter('category', function() {
   return function(categories) {
    var categoryIds = ['World'];
    var result = [];
     angular.forEach(categoryIds, function (categoryId) {
     angular.forEach(categories, function (category) {
          if (category.name == categoryId) { 
             console.log("Match"); 
             result.push(category);
          }
      });
    });
   return result;
  };
});

您的过滤器应该是这样的,它应该在$resource query的transformResponse中调用,而不是在service中调用,我希望这将对您有所帮助

'use strict';

 angular.module('navbar').filter('category', function() {
  return function(categories) {
    var categoryIds = ['World'];
    var result = [];
    angular.forEach(categoryIds, function (categoryId) {
        angular.forEach(categories, function (category) {
            if (category.name == categoryId) { 
              console.log("Match"); 
                result.push(category);
            }
        });
    });
    return result;
   };
 });
您的categoryResource.service应该是这样的

 angular.module('shared').factory('categoryResourceService', 
   ['$resource','categoryFilter', function($resource, categoryFilter) {
     var provider = "categories.json"; 
     var params = { 
               id: '@id'
           };
     return $resource(provider, params, {
         query: {
           isArray: true,
           method: 'GET',
           params: {},
           transformResponse: function(categories) { 
                var results = categoryFilter(angular.fromJson(categories));  
                console.log("[categoryResourceService] filtered response:", results);
                return results;
           }
        }
    });
 }]);
'use strict';

angular.module('navbar').component('appNavbar', {
   templateUrl: "navbar.template.html",
   controller: [ 'navbarService', function appNavbarController(navbarService) {
   var vm = this; 
   vm.categories = navbarService.getCategories();
 }]
});
 'use strict';

angular.module('navbar').component('appNavbar', {
     templateUrl: "navbar.template.html",
     controller: [ 'navbarService', function appNavbarController(navbarService) {
         var vm = this; 
         navbarService.getCategories(function(data){
             // this will be called when service will get the response and filter function has filtered the response
             vm.categories = data;
         });
      }]
}); 
 'use strict';

angular.module('navbar').service('navbarService', ['categoryResourceService', 'categoryFilter', function(categoryResourceService, categoryFilter) {
var vm = this;
vm.getCategories = function(callback) {
  categoryResourceService.query(function(response) {
    console.log("[NavbarService] response:", response);
    callback(categoryFilter(response));
  }, function(error) {
    console.log("[NavbarService] error:", error);
  });
  //return vm.categories;  
}

}]);
  'use strict';

  angular.module('navbar').filter('category', function() {
   return function(categories) {
    var categoryIds = ['World'];
    var result = [];
     angular.forEach(categoryIds, function (categoryId) {
     angular.forEach(categories, function (category) {
          if (category.name == categoryId) { 
             console.log("Match"); 
             result.push(category);
          }
      });
    });
   return result;
  };
});
服务应该是这样简单

 'use strict';

angular.module('navbar')
.service('navbarService', [ 'categoryResourceService', function (categoryResourceService) {
    var vm = this; 
vm.getCategories = function(){
  vm.categories = categoryResourceService.query(function(response){
    console.log("[NavbarService] response:", response); 
  }, function(error){
    console.log("[NavbarService] error:", error);
  });
  return vm.categories;  
 }

}]);
还有像这样的组件

 angular.module('shared').factory('categoryResourceService', 
   ['$resource','categoryFilter', function($resource, categoryFilter) {
     var provider = "categories.json"; 
     var params = { 
               id: '@id'
           };
     return $resource(provider, params, {
         query: {
           isArray: true,
           method: 'GET',
           params: {},
           transformResponse: function(categories) { 
                var results = categoryFilter(angular.fromJson(categories));  
                console.log("[categoryResourceService] filtered response:", results);
                return results;
           }
        }
    });
 }]);
'use strict';

angular.module('navbar').component('appNavbar', {
   templateUrl: "navbar.template.html",
   controller: [ 'navbarService', function appNavbarController(navbarService) {
   var vm = this; 
   vm.categories = navbarService.getCategories();
 }]
});
 'use strict';

angular.module('navbar').component('appNavbar', {
     templateUrl: "navbar.template.html",
     controller: [ 'navbarService', function appNavbarController(navbarService) {
         var vm = this; 
         navbarService.getCategories(function(data){
             // this will be called when service will get the response and filter function has filtered the response
             vm.categories = data;
         });
      }]
}); 
 'use strict';

angular.module('navbar').service('navbarService', ['categoryResourceService', 'categoryFilter', function(categoryResourceService, categoryFilter) {
var vm = this;
vm.getCategories = function(callback) {
  categoryResourceService.query(function(response) {
    console.log("[NavbarService] response:", response);
    callback(categoryFilter(response));
  }, function(error) {
    console.log("[NavbarService] error:", error);
  });
  //return vm.categories;  
}

}]);
  'use strict';

  angular.module('navbar').filter('category', function() {
   return function(categories) {
    var categoryIds = ['World'];
    var result = [];
     angular.forEach(categoryIds, function (categoryId) {
     angular.forEach(categories, function (category) {
          if (category.name == categoryId) { 
             console.log("Match"); 
             result.push(category);
          }
      });
    });
   return result;
  };
});

另一种简单的方法是像这样从组件向服务传递回调函数

 angular.module('shared').factory('categoryResourceService', 
   ['$resource','categoryFilter', function($resource, categoryFilter) {
     var provider = "categories.json"; 
     var params = { 
               id: '@id'
           };
     return $resource(provider, params, {
         query: {
           isArray: true,
           method: 'GET',
           params: {},
           transformResponse: function(categories) { 
                var results = categoryFilter(angular.fromJson(categories));  
                console.log("[categoryResourceService] filtered response:", results);
                return results;
           }
        }
    });
 }]);
'use strict';

angular.module('navbar').component('appNavbar', {
   templateUrl: "navbar.template.html",
   controller: [ 'navbarService', function appNavbarController(navbarService) {
   var vm = this; 
   vm.categories = navbarService.getCategories();
 }]
});
 'use strict';

angular.module('navbar').component('appNavbar', {
     templateUrl: "navbar.template.html",
     controller: [ 'navbarService', function appNavbarController(navbarService) {
         var vm = this; 
         navbarService.getCategories(function(data){
             // this will be called when service will get the response and filter function has filtered the response
             vm.categories = data;
         });
      }]
}); 
 'use strict';

angular.module('navbar').service('navbarService', ['categoryResourceService', 'categoryFilter', function(categoryResourceService, categoryFilter) {
var vm = this;
vm.getCategories = function(callback) {
  categoryResourceService.query(function(response) {
    console.log("[NavbarService] response:", response);
    callback(categoryFilter(response));
  }, function(error) {
    console.log("[NavbarService] error:", error);
  });
  //return vm.categories;  
}

}]);
  'use strict';

  angular.module('navbar').filter('category', function() {
   return function(categories) {
    var categoryIds = ['World'];
    var result = [];
     angular.forEach(categoryIds, function (categoryId) {
     angular.forEach(categories, function (category) {
          if (category.name == categoryId) { 
             console.log("Match"); 
             result.push(category);
          }
      });
    });
   return result;
  };
});
现在的服务应该是这样的

 angular.module('shared').factory('categoryResourceService', 
   ['$resource','categoryFilter', function($resource, categoryFilter) {
     var provider = "categories.json"; 
     var params = { 
               id: '@id'
           };
     return $resource(provider, params, {
         query: {
           isArray: true,
           method: 'GET',
           params: {},
           transformResponse: function(categories) { 
                var results = categoryFilter(angular.fromJson(categories));  
                console.log("[categoryResourceService] filtered response:", results);
                return results;
           }
        }
    });
 }]);
'use strict';

angular.module('navbar').component('appNavbar', {
   templateUrl: "navbar.template.html",
   controller: [ 'navbarService', function appNavbarController(navbarService) {
   var vm = this; 
   vm.categories = navbarService.getCategories();
 }]
});
 'use strict';

angular.module('navbar').component('appNavbar', {
     templateUrl: "navbar.template.html",
     controller: [ 'navbarService', function appNavbarController(navbarService) {
         var vm = this; 
         navbarService.getCategories(function(data){
             // this will be called when service will get the response and filter function has filtered the response
             vm.categories = data;
         });
      }]
}); 
 'use strict';

angular.module('navbar').service('navbarService', ['categoryResourceService', 'categoryFilter', function(categoryResourceService, categoryFilter) {
var vm = this;
vm.getCategories = function(callback) {
  categoryResourceService.query(function(response) {
    console.log("[NavbarService] response:", response);
    callback(categoryFilter(response));
  }, function(error) {
    console.log("[NavbarService] error:", error);
  });
  //return vm.categories;  
}

}]);
  'use strict';

  angular.module('navbar').filter('category', function() {
   return function(categories) {
    var categoryIds = ['World'];
    var result = [];
     angular.forEach(categoryIds, function (categoryId) {
     angular.forEach(categories, function (category) {
          if (category.name == categoryId) { 
             console.log("Match"); 
             result.push(category);
          }
      });
    });
   return result;
  };
});
过滤器将是这样的

 angular.module('shared').factory('categoryResourceService', 
   ['$resource','categoryFilter', function($resource, categoryFilter) {
     var provider = "categories.json"; 
     var params = { 
               id: '@id'
           };
     return $resource(provider, params, {
         query: {
           isArray: true,
           method: 'GET',
           params: {},
           transformResponse: function(categories) { 
                var results = categoryFilter(angular.fromJson(categories));  
                console.log("[categoryResourceService] filtered response:", results);
                return results;
           }
        }
    });
 }]);
'use strict';

angular.module('navbar').component('appNavbar', {
   templateUrl: "navbar.template.html",
   controller: [ 'navbarService', function appNavbarController(navbarService) {
   var vm = this; 
   vm.categories = navbarService.getCategories();
 }]
});
 'use strict';

angular.module('navbar').component('appNavbar', {
     templateUrl: "navbar.template.html",
     controller: [ 'navbarService', function appNavbarController(navbarService) {
         var vm = this; 
         navbarService.getCategories(function(data){
             // this will be called when service will get the response and filter function has filtered the response
             vm.categories = data;
         });
      }]
}); 
 'use strict';

angular.module('navbar').service('navbarService', ['categoryResourceService', 'categoryFilter', function(categoryResourceService, categoryFilter) {
var vm = this;
vm.getCategories = function(callback) {
  categoryResourceService.query(function(response) {
    console.log("[NavbarService] response:", response);
    callback(categoryFilter(response));
  }, function(error) {
    console.log("[NavbarService] error:", error);
  });
  //return vm.categories;  
}

}]);
  'use strict';

  angular.module('navbar').filter('category', function() {
   return function(categories) {
    var categoryIds = ['World'];
    var result = [];
     angular.forEach(categoryIds, function (categoryId) {
     angular.forEach(categories, function (category) {
          if (category.name == categoryId) { 
             console.log("Match"); 
             result.push(category);
          }
      });
    });
   return result;
  };
});

另一种简单的方法是像这样从组件向服务传递回调函数

 angular.module('shared').factory('categoryResourceService', 
   ['$resource','categoryFilter', function($resource, categoryFilter) {
     var provider = "categories.json"; 
     var params = { 
               id: '@id'
           };
     return $resource(provider, params, {
         query: {
           isArray: true,
           method: 'GET',
           params: {},
           transformResponse: function(categories) { 
                var results = categoryFilter(angular.fromJson(categories));  
                console.log("[categoryResourceService] filtered response:", results);
                return results;
           }
        }
    });
 }]);
'use strict';

angular.module('navbar').component('appNavbar', {
   templateUrl: "navbar.template.html",
   controller: [ 'navbarService', function appNavbarController(navbarService) {
   var vm = this; 
   vm.categories = navbarService.getCategories();
 }]
});
 'use strict';

angular.module('navbar').component('appNavbar', {
     templateUrl: "navbar.template.html",
     controller: [ 'navbarService', function appNavbarController(navbarService) {
         var vm = this; 
         navbarService.getCategories(function(data){
             // this will be called when service will get the response and filter function has filtered the response
             vm.categories = data;
         });
      }]
}); 
 'use strict';

angular.module('navbar').service('navbarService', ['categoryResourceService', 'categoryFilter', function(categoryResourceService, categoryFilter) {
var vm = this;
vm.getCategories = function(callback) {
  categoryResourceService.query(function(response) {
    console.log("[NavbarService] response:", response);
    callback(categoryFilter(response));
  }, function(error) {
    console.log("[NavbarService] error:", error);
  });
  //return vm.categories;  
}

}]);
  'use strict';

  angular.module('navbar').filter('category', function() {
   return function(categories) {
    var categoryIds = ['World'];
    var result = [];
     angular.forEach(categoryIds, function (categoryId) {
     angular.forEach(categories, function (category) {
          if (category.name == categoryId) { 
             console.log("Match"); 
             result.push(category);
          }
      });
    });
   return result;
  };
});
现在的服务应该是这样的

 angular.module('shared').factory('categoryResourceService', 
   ['$resource','categoryFilter', function($resource, categoryFilter) {
     var provider = "categories.json"; 
     var params = { 
               id: '@id'
           };
     return $resource(provider, params, {
         query: {
           isArray: true,
           method: 'GET',
           params: {},
           transformResponse: function(categories) { 
                var results = categoryFilter(angular.fromJson(categories));  
                console.log("[categoryResourceService] filtered response:", results);
                return results;
           }
        }
    });
 }]);
'use strict';

angular.module('navbar').component('appNavbar', {
   templateUrl: "navbar.template.html",
   controller: [ 'navbarService', function appNavbarController(navbarService) {
   var vm = this; 
   vm.categories = navbarService.getCategories();
 }]
});
 'use strict';

angular.module('navbar').component('appNavbar', {
     templateUrl: "navbar.template.html",
     controller: [ 'navbarService', function appNavbarController(navbarService) {
         var vm = this; 
         navbarService.getCategories(function(data){
             // this will be called when service will get the response and filter function has filtered the response
             vm.categories = data;
         });
      }]
}); 
 'use strict';

angular.module('navbar').service('navbarService', ['categoryResourceService', 'categoryFilter', function(categoryResourceService, categoryFilter) {
var vm = this;
vm.getCategories = function(callback) {
  categoryResourceService.query(function(response) {
    console.log("[NavbarService] response:", response);
    callback(categoryFilter(response));
  }, function(error) {
    console.log("[NavbarService] error:", error);
  });
  //return vm.categories;  
}

}]);
  'use strict';

  angular.module('navbar').filter('category', function() {
   return function(categories) {
    var categoryIds = ['World'];
    var result = [];
     angular.forEach(categoryIds, function (categoryId) {
     angular.forEach(categories, function (category) {
          if (category.name == categoryId) { 
             console.log("Match"); 
             result.push(category);
          }
      });
    });
   return result;
  };
});
过滤器将是这样的

 angular.module('shared').factory('categoryResourceService', 
   ['$resource','categoryFilter', function($resource, categoryFilter) {
     var provider = "categories.json"; 
     var params = { 
               id: '@id'
           };
     return $resource(provider, params, {
         query: {
           isArray: true,
           method: 'GET',
           params: {},
           transformResponse: function(categories) { 
                var results = categoryFilter(angular.fromJson(categories));  
                console.log("[categoryResourceService] filtered response:", results);
                return results;
           }
        }
    });
 }]);
'use strict';

angular.module('navbar').component('appNavbar', {
   templateUrl: "navbar.template.html",
   controller: [ 'navbarService', function appNavbarController(navbarService) {
   var vm = this; 
   vm.categories = navbarService.getCategories();
 }]
});
 'use strict';

angular.module('navbar').component('appNavbar', {
     templateUrl: "navbar.template.html",
     controller: [ 'navbarService', function appNavbarController(navbarService) {
         var vm = this; 
         navbarService.getCategories(function(data){
             // this will be called when service will get the response and filter function has filtered the response
             vm.categories = data;
         });
      }]
}); 
 'use strict';

angular.module('navbar').service('navbarService', ['categoryResourceService', 'categoryFilter', function(categoryResourceService, categoryFilter) {
var vm = this;
vm.getCategories = function(callback) {
  categoryResourceService.query(function(response) {
    console.log("[NavbarService] response:", response);
    callback(categoryFilter(response));
  }, function(error) {
    console.log("[NavbarService] error:", error);
  });
  //return vm.categories;  
}

}]);
  'use strict';

  angular.module('navbar').filter('category', function() {
   return function(categories) {
    var categoryIds = ['World'];
    var result = [];
     angular.forEach(categoryIds, function (categoryId) {
     angular.forEach(categories, function (category) {
          if (category.name == categoryId) { 
             console.log("Match"); 
             result.push(category);
          }
      });
    });
   return result;
  };
});

您正在getCatagories函数中声明一个局部变量,在筛选器中传递该变量时无法访问该局部变量function@GhulamMohayudin你能再解释一下吗?我看不出将categories变量传递给CategorityFilter的问题,因为它们处于同一级别,此外,您可以在服务中直接复制粘贴CategoryFilter中的代码,但它仍然无法工作。好的,让我为您添加一个答案you@GhulamMohayudin谢谢,您在getCatagories函数中声明了一个局部变量,在筛选器中传递该变量时无法访问function@GhulamMohayudin你能再解释一下吗?我没有发现将categories变量传递给categorityfilter的问题,因为它们处于同一级别,而且您可以在服务中直接复制粘贴categorityfilter中的代码,但仍然无法工作。好的,让我为其添加一个答案you@GhulamMohayudin谢谢你它不起作用,我用你的代码更新了plunker:(您可以在控制台中看到,过滤后的响应是一个空数组,因为它试图在从服务器获取响应之前对响应应用过滤器,这真的很奇怪,因为处理是在成功回调中。Habchi请使用此代码,如果您遇到任何问题,请告诉我。它不起作用,我用您的代码更新了plunker:(您可以在控制台中看到,筛选后的响应是一个空数组,因为它在从服务器获取响应之前尝试对响应应用筛选器,这真的很奇怪,因为处理是在成功回调中。请使用此代码,如果遇到任何问题,请告诉我