因式分解AngularJS-如何正确使用工厂来请求和更新表示数据的数据

因式分解AngularJS-如何正确使用工厂来请求和更新表示数据的数据,angularjs,angularjs-factory,Angularjs,Angularjs Factory,我一直在努力找出使用工厂表示ajax数据的“角度”工作方式(我使用配置在控制器之间进行了大量共享)。我做了一些广泛的研究,所有的答案似乎分为两类: 使用工厂表示数据,然后在控制器中获取数据并更新工厂: {不打算成为实际可运行的} 使用工厂用承诺表示http请求,然后将该数据分配给$scope var app = angular.module('main', []) app.factory('data', function ($http, $q){ var factory = {};

我一直在努力找出使用工厂表示ajax数据的“角度”工作方式(我使用配置在控制器之间进行了大量共享)。我做了一些广泛的研究,所有的答案似乎分为两类:

  • 使用工厂表示数据,然后在控制器中获取数据并更新工厂:
  • {不打算成为实际可运行的}

  • 使用工厂用承诺表示http请求,然后将该数据分配给$scope

    var app = angular.module('main', [])
    app.factory('data', function ($http, $q){
        var factory = {};
        factory.getdata = function(){
            var defer = $q.defer();
            $http.get('/data').success(function(idata) {
                defer.resolve(idata);
            })
            return defer.promise;
        }
        return factory;
    });
    app.controller('cntrl', [$scope, data]){
        $scope.data = []
        data.getdata().then(function(idata) { $scope.data = idata });
    }
    
  • 我对此有几个问题,在第一类中,工厂看起来非常蹩脚,好像没有增加多少价值,每个控制器都需要有代码来操作工厂。对于第二个控制器,工厂非常复杂,实际上并不存储数据(用于在控制器之间共享),只是代表了编写http.get的冗长方法

    我的问题是: 我如何使用工厂来表示我的数据,并以干净的方式管理对该数据的操作?我想做的是这样的:

    var app = angular.module('main',[])
    app.factory('data', function($http){
         var factory = {}
         factory.data = []
         factory.initialise = function(){
             $http.get('/data').success(
                  function(data){
                       factory.data = data
                  }
             )
         }
         return factory
    })
    app.controller('cntrlA', [$scope, data]) {
        $scope.data = data.data
        $data.initialise()
    }
    app.controller('cntrlB', [$scope, data]) {
        $scope.data = data.data
    }
    

    我正在处理一个类似问题的项目。我最后做的是将该服务用作数据存储库。不是每次初始化函数获取新数据,而是仅当数据存储库为空或
    getFresh
    标志被触发(手动覆盖)时才获取新数据。这样,每个控制器都可以调用相同的函数来获取数据,并根据控制器的需要对其进行操作,而不会篡改原始数据

    var app = angular.module('main',[])
    
    app.factory('dataService', function($http, $q){
         var factory = {}
         factory.data = []
         factory.getFresh = false
    
         factory.initialise = function(){
             var deferred = $q.defer()
             if(factory.data.length===0 || factory.getFresh) {
                 $http.get('/data').success(function(data){
                          factory.data = data
                          deferred.resolve(data)
                 })
             }
             else{
                 deferred.resolve(factory.data)
             }
             return deferred.promise
         }
    
         return factory
    })
    
    app.controller('cntrlA', [$scope, dataService]) {
        $scope.data = []
        dataService.initialise().then(function(data){
           $scope.data = data
        }
    }
    
    app.controller('cntrlB', [$scope, dataService]) {
        $scope.data = []
        dataService.initialise().then(function(data){
           $scope.data = data
        }
    }
    
    var app = angular.module('main',[])
    
    app.factory('dataService', function($http, $q){
         var factory = {}
         factory.data = []
         factory.getFresh = false
    
         factory.initialise = function(){
             var deferred = $q.defer()
             if(factory.data.length===0 || factory.getFresh) {
                 $http.get('/data').success(function(data){
                          factory.data = data
                          deferred.resolve(data)
                 })
             }
             else{
                 deferred.resolve(factory.data)
             }
             return deferred.promise
         }
    
         return factory
    })
    
    app.controller('cntrlA', [$scope, dataService]) {
        $scope.data = []
        dataService.initialise().then(function(data){
           $scope.data = data
        }
    }
    
    app.controller('cntrlB', [$scope, dataService]) {
        $scope.data = []
        dataService.initialise().then(function(data){
           $scope.data = data
        }
    }