问题描述
我有一个应用程序,当您选择一个项目时,它进入项目部分,它需要异步加载有关项目的所有信息和数据。
我想将所有数据存储在单件服务中,以便我可以访问所有项目子部分中的数据(项目标题,项目页脚,主菜单等)
如果用户单击其他项目,则需要使用不同的URL参数(在本例中为project_id)重新初始化。
app.factory('ProjectService', function($http, project_id) { var SERVICE = { async: function() { var promise = $http.get('SOME URL' + project_id).then(function(response) { return response.data; }); return promise; } }; return SERVICE; });
实现此目的的最佳方法是什么?当用户单击按钮时,如何使用不同的URL参数重新初始化服务?
1楼
Joy
3
已采纳
2015-07-30 17:38:47
检查工作演示:
首先,使用factory
可能更适合您的情况。
您需要手动使用延迟/承诺。 如果已加载请求的id,请立即解析延迟对象。 否则,发送HTTP请求(在演示中我只使用 )并获取项目信息。
app.factory('ProjectFactory', ['$http', '$q', function ($http, $q) {
var myProject;
return {
project: function (id) {
var deferred = $q.defer();
// If the requested id is fetched already, just resolve
if (!id || (myProject && myProject.id === id)) {
console.log('get from cache');
deferred.resolve(myProject);
} else {
console.log('sending request...');
$http.get('http://jsonplaceholder.typicode.com/posts/' + id).success(function (response) {
myProject = response;
deferred.resolve(myProject);
}).error(function (response) {
deferred.reject(response);
});
}
return deferred.promise;
}
};
}]);
要使用这个工厂:
app.controller('JoyCtrl', ['$scope', '$timeout', 'ProjectFactory', function ($scope, $timeout, ProjectFactory) {
ProjectFactory.project(1).then(function (project) {
$scope.project = project;
ProjectFactory.project(1).then(function (project) {
});
}, function (reason) {
console.log('Failed: ' + reason);
});
}]);
供您参考: ,