gpt4 book ai didi

angularjs - 重新使用 Controller /工厂时防止多次 ajax 调用

转载 作者:行者123 更新时间:2023-12-02 03:33:12 25 4
gpt4 key购买 nike

刚刚真正开始使用 Angular,需要一些关于在重复使用具有多个 View 的 Controller 时防止对相同数据重复 ajax 请求的建议。

所以我说 6 个 View 都引用相同的 Controller 但不同的 View

应用程序.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);
}());

samplesFactory.js

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

var factory = {};

factory.getSamples = function() {
return $http.jsonp('http://www.website.com/app/index.php?callback=JSON_CALLBACK');
};

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

所以有了这个 - 每次加载新 View 时都会再次发出 ajax 请求 - 我将如何重新设计以只发生一个请求?

一如既往地提前致谢

卡尔

更新:下面标记的答案,但我也通过在 jsonp 请求中将“缓存”配置项/属性(无论它叫什么)更改为 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() 返回一个您应该在 Controller 中管理的 promise 。

关于angularjs - 重新使用 Controller /工厂时防止多次 ajax 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25462176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com