我的应用程序有几个视图,每个视图都有一个控制器。
我有几个返回标准 JSON 数组的 API 资源。每当视图更改时,都会重新查询资源以获取相当慢的新数据。我更愿意为我的控制器提供 API 资源,而无需每次都重新查询。
最好的方法是什么?
我的应用程序有几个视图,每个视图都有一个控制器。
我有几个返回标准 JSON 数组的 API 资源。每当视图更改时,都会重新查询资源以获取相当慢的新数据。我更愿意为我的控制器提供 API 资源,而无需每次都重新查询。
最好的方法是什么?
如果我理解正确,那么这就是服务的用途。它们有点像控制器共享数据的中心位置。
我查看了本教程中使用的代码的 jsfiddle:
http://onehungrymind.com/angularjs-communicating-between-controllers/
var myModule = angular.module('myModule', []);
myModule.factory('mySharedService', function($rootScope) {
var sharedService = {};
sharedService.message = '';
sharedService.prepForBroadcast = function(msg) {
this.message = msg;
this.broadcastItem();
};
sharedService.broadcastItem = function() {
$rootScope.$broadcast('handleBroadcast');
};
return sharedService;
});
function ControllerZero($scope, sharedService) {
$scope.handleClick = function(msg) {
sharedService.prepForBroadcast(msg);
};
$scope.$on('handleBroadcast', function() {
$scope.message = sharedService.message;
});
}
function ControllerOne($scope, sharedService) {
$scope.$on('handleBroadcast', function() {
$scope.message = 'ONE: ' + sharedService.message;
});
}
function ControllerTwo($scope, sharedService) {
$scope.$on('handleBroadcast', function() {
$scope.message = 'TWO: ' + sharedService.message;
});
}
ControllerZero.$inject = ['$scope', 'mySharedService'];
ControllerOne.$inject = ['$scope', 'mySharedService'];
ControllerTwo.$inject = ['$scope', 'mySharedService'];
编辑
对于资源调用,我现在有一个像这样使用它们的服务。抱歉,它在咖啡脚本中
.factory('EventService', (SubEvent, User) ->
subevents = {}
return {
getSubevent: (subevent_id) ->
SubEvent.get {subevent_id: subevent_id}, (subevent) ->
participants = (participant.user for participant in subevent.participants)
User.query {participants: participants}, (users) ->
for user,i in users
subevent.participants[i].user = user
subevents[subevent_id] = subevent
}
)
由于两者都$http
支持$resource
开箱即用的缓存,因此您无需编写自己的缓存。要调整默认缓存行为,请查看$cacheFactory
.
这是我正在处理的应用程序的一个示例:
var app = angular.module('app', ['ngResource']);
app
.factory('Worklogs', function($resource) {
return $resource('/tempo/worklogs', {}, {
'query': {method:'GET', isArray:true, cache: true}
});
})
.controller('FirstCtrl', function($scope, Worklogs, $log, $filter){
$scope.search = SearchParameters;
$scope.worklogs = Worklogs.query({dateFrom: $scope.search.dateFrom, dateTo: $scope.search.dateTo});
})
.controller('SecondCtrl', function($scope, Worklogs, $log, $filter){
$scope.search = SearchParameters;
$scope.worklogs = Worklogs.query({dateFrom: $scope.search.dateFrom, dateTo: $scope.search.dateTo});
})
控制器第一次加载和每次新参数传入query()
时,Worklogs 服务都会发出一个 HTTP 请求。每当更改控制器并重复先前的查询时,都会从缓存中加载工作日志(并且不发出 HTTP 请求)。
我正在使用 AngularJS 1.1.5,因为 1.0.x 分支缺少很多很酷的东西......可能包括这个。