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