我有一個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