Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.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
Angularjs 在重新使用控制器/工厂时防止多个ajax调用_Angularjs - Fatal编程技术网

Angularjs 在重新使用控制器/工厂时防止多个ajax调用

Angularjs 在重新使用控制器/工厂时防止多个ajax调用,angularjs,Angularjs,刚从Angular开始,需要一些建议,以防止在重新使用具有多个视图的控制器时重复ajax请求相同的数据 所以我有6个视图,它们都引用相同的控制器,但是不同的视图 app.js (function() { var app = angular.module('myApp', ['ngRoute','ui.unique']); app.config(function ($routeProvider) { // Routes $routeProvider .when('

刚从Angular开始,需要一些建议,以防止在重新使用具有多个视图的控制器时重复ajax请求相同的数据

所以我有6个视图,它们都引用相同的控制器,但是不同的视图

app.js

(function() {
var app = angular.module('myApp', ['ngRoute','ui.unique']);

app.config(function ($routeProvider) {
    // Routes
    $routeProvider
        .when('/',
            {
                controller: 'SamplesController',
                templateUrl: 'app/views/home.html'
            })
        .when('/view2/',
            {
                controller: 'SamplesController',
                templateUrl: 'app/views/main.html'
            })
        .when('/view3/:rangeName',
            {
                controller: 'SamplesController',
                templateUrl: 'app/views/samples.html'
        })
        .when('/view4/:rangeName',
            {
                controller: 'SamplesController',
                templateUrl: 'app/views/samples.html'
        })
        .when('/view5/',
            {
                controller: 'SamplesController',
                templateUrl: 'app/views/basket.html'
        })
        .when('/view6/',
            {
                controller: 'SamplesController',
                templateUrl: 'app/views/lightbox.html'
        })
        .otherwise({ redirectTo: '/' });
});
}());
samplesController.js

(function() {
var SamplesController = function ($scope, SamplesFactory, appSettings, $routeParams) {

    function init() {
        // back function
        $scope.$back = function() { 
            window.history.back();
        };

        // app settings
        $scope.settings = appSettings;

        // samples list
        SamplesFactory.getSamples()
            .success(function(data){
                var returnSamples = [];
                    for (var i=0,len=data.length;i<len;i++) {
                        if (data[i].range === $routeParams.rangeName) {
                            returnSamples.push(data[i]);
                        }
                    }
                $scope.samples = returnSamples;
            })
            .error(function(data, status, headers, config){
                // return empty object
                return {};
            });

        // variables for both ranges
        $scope.rangeName = $routeParams.rangeName;

        // click to change type 
        $scope.populate = function(type) {
               $scope.attributeValue = type;
        };
    };

    init();
};

SamplesController.$inject = ['$scope','SamplesFactory', 'appSettings', '$routeParams'];

angular.module('myApp').controller('SamplesController', SamplesController);
}());
因此,每次加载一个新视图时,都会再次发出ajax请求,我该如何重新安排只发生一个请求呢

像往常一样提前感谢

卡尔

更新:下面标记了答案,但我也成功地将jsonp请求中的“cache”配置项/属性(无论其名称如何)更改为true

return $http.jsonp('http://www.website.com/app/index.php?callback=JSON_CALLBACK',{cache: true});

您可以通过以下方式更改工厂:

(function () {
    var SamplesFactory = function ($http) {

    var factory = {},
        samples = $http.jsonp('http://www.website.com/app/index.php?callback=JSON_CALLBACK');


    factory.getSamples = function() {
        return samples;
    };

    return factory;
    };
    SamplesFactory.$inject = ['$http'];
    angular.module('myApp').factory('SamplesFactory', SamplesFactory);
}());

现在
getSamples()
返回一个承诺,您应该在控制器中管理该承诺。

如果您希望可以使用服务存储来自第一次响应的数据。。。但我建议每个视图获取数据,不要更改您的实现。。。它保持每个视图干净,并遵循SOC原则标记为答案,因为这样做很好——通过将配置值“cache”设置为true并返回$http.jsonp(“”,{cache:true}),我也取得了一些成功;
(function () {
    var SamplesFactory = function ($http) {

    var factory = {},
        samples = $http.jsonp('http://www.website.com/app/index.php?callback=JSON_CALLBACK');


    factory.getSamples = function() {
        return samples;
    };

    return factory;
    };
    SamplesFactory.$inject = ['$http'];
    angular.module('myApp').factory('SamplesFactory', SamplesFactory);
}());