【问题标题】:AngularJS filter table: $http.getAngularJS 过滤表:$http.get
【发布时间】:2015-05-11 16:54:27
【问题描述】:

我正在使用 AngularJS 设置一个表格并通过搜索或类别关键字过滤其数据。我

AngularJS

categorieFilter = angular.module("categorieFilter", [])
categorieFilter.controller("catFilter", ["$scope", "store", function($scope, store){
    $scope.search = "";
    $scope.products = [];
    $scope.categories = [];

    $scope.categories = store.getCategories();
    $scope.products = store.getProducts();

    $scope.filterProductsByCats = function(category){
    $scope.search = category;
    };
}])
categorieFilter.factory('store', function($http){
          return {
            getCategories: $http.get('api/categories').success(function (data) {
                return data;
            }),
            getProducts : $http.get('api/products').success(function (data) {
                return data;
            }
        };
    });  

$http.get 本身正在工作,当我直接浏览到我的 api 时,我得到了所需的数据。此外,当我在类别中的 $hhtp.get 之后执行警报(数据)时,我得到了我需要的数据......所以这应该有效,但它没有。我收到一个错误:

TypeError: store.getCategories 不是函数

我不知道这是从哪里来的。有人解决这个问题吗?

【问题讨论】:

    标签: javascript angularjs


    【解决方案1】:

    使用工厂时,您应该使用new 函数来返回构造函数:

    function myFactoryFunction() {
        return function() {
            var a = 2;
            this.a2 = function() {
                return a*2;
            };
        };
    }
    ---------------------------------------------------------------------------------
    // Injected in your controller
    var myShinyNewObject = new myInjectedFactory();
    $scope.four = myShinyNewObject.a2();
    

    From this detailed post angular.service vs angular.factory

    你的情况

    var storeFactory = new store();
    storeFactory.getProducts();
    

    更新版本,带有 TS 代码:

    categorieFilter = angular.module("categorieFilter", [])
    /**
    Store factory
    */
    categorieFilter.controller("catFilter", ["$scope", "store", function($scope, store){
        $scope.search = "";
        $scope.products = [];
        $scope.categories = [];
    
        store.getCategories().then(function(data){
            $scope.categories = data;
        })
    
        store.getProducts().then(function(data){
            $scope.products = data;
        })
    
        $scope.filterProductsByCats = function(category){
        $scope.search = category;
        };
    }])
    
    
    
    /**
    Store factory
    */
    categorieFilter.factory('store', function($http, $q){
    
        function _getCategory (){
            var deferred = $q.defer();
    
            $http.get('api/categories').success(function (data) {
                    deferred.resolve(data);
                })
    
            return deferred.promise;
        }
    
        function _getProducts (){
            var deferred = $q.defer();
    
            $http.get('api/products').success(function (data) {
                            deferred.resolve(data);
                        }
    
            return deferred.promise;
        }
    
    
              return {
                getCategories: _getCategory,
                getProducts : _getProducts
            };
        });  
    

    【讨论】:

    • 你能在我的代码中编辑它吗?因为当我做我认为你所说的事情时,我得到另一个错误:TypeError: object is not a function
    • 我从我的服务器获取数据,但我将每个项目获取为:["Lattes"],["CC Blend"],...?当我只是提醒数据时,它看起来很正常。这和延期有关系吗?
    • defered 只是实现 Promise 的一种方式,AJAX 工作的异步方式;因此,如果您获得正确的数据,那么您应该能够访问它,例如 $scope.products = data[0];
    • 是的,很抱歉,在我发表评论后立即发现了它。非常感谢您的帮助!
    【解决方案2】:

    我通常使用 $resource 创建服务。你可以试试这个:

    categorieFilter = angular.module("categorieFilter", []);
    
    categorieFilter.factory('categoryStore', [
      '$resource',
      function($resource) {
        return $resource('/api/categories/', {}, {
          getCategories: { method: 'GET', params: {} },
        });
      }
    ]);
    
    categorieFilter.factory('productsStore', [
      '$resource',
      function ($resource) {
        return $resource('/api/products/', {}, {
          getProducts: { method: 'GET', params: {} },
        });
      }
    ]);
    
    categorieFilter.controller("catFilter", [
      "$scope", "categoryStore", "productsStore", function ($scope, categoryStore, productsStore) {
        $scope.search = "";
        $scope.products = [];
        $scope.categories = [];
    
        $scope.categories = categoryStore.getCategories();
        $scope.products = productsStore.getProducts();
        $scope.filterProductsByCats = function(category) {
          $scope.search = category;
        };
      }
    ]);
    

    【讨论】:

    • 我猜它不识别 $resource ?错误:[$injector:unpr] 未知提供者:$resourceProvider
    • 添加'ngResource',作为一个依赖:angular.module('helpdesk', ['ngResource', 'ui.bootstrap', 'helpdeskServices', 'helpdeskControllers', 'ngMaterial', 'autoCompleteControllers', '菜单' ]);
    【解决方案3】:

    我通常编写传递回调函数参数的 http 工厂(我通常使用 Node,并且习惯于为长时间工作的函数执行此操作)。获取您的代码,它看起来像这样:

    categorieFilter = angular.module("categorieFilter", [])
    categorieFilter.controller("catFilter", ["$scope", "store", function($scope, store){
        $scope.search = "";
        $scope.products = [];
        $scope.categories = [];
    
        store.getCategories(function(err, data){
          if(!err)
            $scope.categories = data;
        });
        store.getProducts(function(err, data){
          if(!err)
            $scope.products = data;
        });
    
        $scope.filterProductsByCats = function(category){
        $scope.search = category;
        };
    }])
    categorieFilter.factory('store', function($http){
              return {
                getCategories: function(next){
                  $http.get('api/categories')
                  .success(function (data) {
                    next(null, data);
                  })
                  .error(function(headers, status){
                    next(status, null);
                  });
                },
                getProducts : function(next){
                 $http.get('api/products')              
                 .success(function (data) {
                    next(null, data);
                  })
                  .error(function(headers, status){
                    next(status, null);
                  });
    
                }
            };
        });  
    

    正如您现在所看到的,工厂接受一个回调,该回调将使用错误和数据参数调用,因此错误处理可以委托或不委托给控制器。这对于复杂的情况非常有用。

    【讨论】:

      【解决方案4】:

      这是一个plunker,它使用 $q 并使用一些随机 JSON 显式延迟。

      var app = angular.module('categorieFilter', []);
      
      app.factory('store', function($http, $q){
      
        return {
          getCategories: function() {
            var deferred = $q.defer();
              $http.get('https://api.myjson.com/bins/2gamd')
                .success(deferred.resolve)
                .error(deferred.resolve);
              return deferred.promise;
          }
        }
      
      })
      
      .controller('catFilter', function($scope, store){
      
          store.getCategories().then(function(data) {
            $scope.categories = data.stories;// change data.stories to whatever your data is
          });
      
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-05-30
        • 2017-07-22
        • 2018-02-03
        • 2019-12-02
        • 2016-03-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多