我有一个Angularjs指令'ExampleDirective',它具有控制器'ExampleController'。控制器定义了两个Promise对象,其中每个Promise对象发出一个Http GET请求并返回响应。AngularJS - 多个指令实例使XHR调用多次
在指令中,我们从promise对象获取响应数据并处理它们以呈现指令。
ExampleDirective在相同的视图中获得两次实例化,并且每个实例都使它自己的Http GET请求。这会导致前端的性能问题,因为同时发送了两个请求来进行昂贵的数据库调用并从同一个表中读取。
控制器:
angular.module('exampleModule')
.constant("EXAMPLE_URL", "{% url 'example:get_example' %}")
.controller('exampleCtrl', ['$scope', '$http', 'EXAMPLE_URL', exampleCtrl]);
function exampleCtrl($scope, $http, EXAMPLE_URL) {
$scope.examplePromise = $http.get(EXAMPLE_URL).then(function(response) {
return response.data;
});
}
指令:
angular.module('exampleModule')
.directive('exampleDirective', ['exampleFactory', 'STATIC_URL', '$http', '$window', exampleDirective]);
function exampleDirective(exampleFactory, STATIC_URL, $http, $window) {
return {
scope: {
title:'@?',
loadingImage:'@?',
},
restrict: 'AE',
templateUrl: STATIC_URL + 'example/example-template.html',
controller: "exampleCtrl",
link: function (scope, element, attrs) {
//add default options:
if (!scope.title) {
scope.title = 'Example Title';
}
if (!scope.loadingImage) {
scope.loadingImage = '';
}
scope.examplePromise.then(function(data) {
scope.exampleData = data;
// do something
});
}
};
}
有没有一种方法来实例化一个指令多次,但没有作出在控制器中的HTTP GET请求两次?
UPDATE 这就是我所做的,我添加了一个服务,如答案中的建议。
服务:
angular.module('chRatingsModule')
.factory('chExampleFactory', ['$http', 'EXAMPLE_URL', chExampleFactory]);
function chExampleFactory($http, EXAMPLE_URL) {
var api = {}
var promise = null;
api.examplePromise = examplePromise;
function examplePromise() {
if (promise == null) {
promise = $http.get(EXAMPLE_URL).then(function(response) {
return response.data;
});
}
return promise;
}
return api;
}
更新指令:
angular.module('exampleModule')
.directive('exampleDirective', ['exampleFactory', 'STATIC_URL', '$http', '$window', exampleDirective]);
function exampleDirective(exampleFactory, STATIC_URL, $http, $window) {
return {
scope: {
title:'@?',
loadingImage:'@?',
},
restrict: 'AE',
templateUrl: STATIC_URL + 'example/example-template.html',
link: function (scope, element, attrs) {
exampleFactory.examplePromise.then(function(data) {
scope.exampleData = data;
// do something
});
}
};
}
服务是** **单身。指令控制器针对指令的每个实例都实例化。在服务中执行XHR以避免重复。 – georgeawg
谢谢@georgeawg – nmusleh