我的一个模块中有一堆重复的代码,我对从所有控制器中获取它的最佳方法感到非常困惑。我有一项管理用户配置文件列表的服务。这些存储在本地的 sessionStorage 中,但如果它为空,则服务会对 API 进行 $http 调用,然后缓存结果。用户可以输入几个不同页面之一,因此我需要确保在显示屏幕之前加载数据。我使用 $modal 弹出一个框,说它正在加载配置文件,而配置文件服务正在考虑它。如果是在sessionStorage中,就是一眨眼;如果它必须进行 API 调用,它会在此过程中等待几秒钟。
这是我的控制器中的重复代码:
var modal = $modal.open({ templateUrl: 'template/modal/loadingProfile.html' });
profileService.getUserBySequence($routeParams.sequence).then(function (data) {
$scope.user = data;
profileService.getProfileForUser($scope.user.Sequence).then(function (data) {
var stop = $timeout(function () {
if (modal.opened) {
modal.close();
$timeout.cancel(stop);
}
}, 100);
$scope.profile = data;
});
});
在每个控制器的顶部都有这不是很愉快。下面看一下配置文件服务:
function getUserBySequence(sequence) {
var defer = $q.defer();
getUserList().then(function (data) {
defer.resolve(data['_' + sequence]);
}, function(result) {
alertService.show(result.data.flash);
defer.reject();
});
return defer.promise;
}
function getUserProfile(sequence) {
var defer = $q.defer();
var profile = sessionService.get('profile.' + sequence, true);
if (profile) {
defer.resolve(profile);
} else {
var companyId = sessionService.get('companyId');
$http.get("http://domain.com/api/getProfile?id=" + companyId + "&sequence=" + sequence).then(function (result) {
// only parse if a string
if (typeof result.data == "string") {
profile = JSON.parse(result.data);
} else {
profile = result.data;
}
sessionService.set('profile.' + sequence, profile, true);
defer.resolve(profile);
}, function (result) {
sessionService.unset('profile.' + sequence);
alertService.show(result.data.flash);
defer.reject();
});
}
return defer.promise;
}
清理控制器的最佳方法是什么?