我的AngularJS单页应用程序中有一个工厂,该工厂将给定日期与JSON文件进行解析,以返回季节和季节中的星期数。我目前在每种方法中两次调用JSON文件$http.get('content/calendar.json').success(function(data) {...
。
无论有多少种方法,我如何都能将一次调用排除在外?
emmanuel.factory('DayService', function($http, $q){
var obj = {};
obj.season = function(d){
// receives a mm/dd/yyyy string parses against Calendar service for liturgical season
d = new Date(d);
var day = d.getTime();
var promise = $q.defer();
var temp;
$http.get('content/calendar.json').success(function(data) {
for (var i=0; i<data.calendar.seasons.season.length; i++){
var start = new Date(data.calendar.seasons.season[i].start);
var end = new Date(data.calendar.seasons.season[i].end);
end.setHours(23,59);
//sets the time to be the last minute of the season
if (day >= start && day <= end){
//if given time fits within start and end dates in calendar then return season
temp = data.calendar.seasons.season[i].name;
//console.log(temp);
promise.resolve(temp);
break;
}
}
});
return promise.promise;
}
obj.weekInSeason = function(d){
//receives a date format mm/dd/yyyy
var promise = $q.defer();
$http.get('content/calendar.json').success(function(data) {
for (var i=0; i<data.calendar.seasons.season.length; i++){
d = new Date(d);
var day = d.getTime();
var end = new Date(data.calendar.seasons.season[i].end);
end.setHours(23,59);
end = end.getTime();
var diff = end - day;
if (parseFloat(diff) > 0){
var start = new Date(data.calendar.seasons.season[i].start);
start = start.getTime();
var startDiff = day - start;
var week = parseInt(startDiff /(1000*60*60*24*7))+1;
promise.resolve(week);
break;
}
}
});
return promise.promise;
}
obj.getData = function (d) {
console.log('DayService.getData')
console.log(today)
var data = $q.all([
this.season(d),
this.weekInSeason(d)
]);
return data;
};
return obj;
});
该解决方案假定content/calendar.json
永远不变。
我已经回答了一个可以以某种方式帮助您解决此问题的问题。基本上,您必须在应用程序引导之前获取所有必要的配置/设置。手动引导应用程序,这意味着您必须删除ng-app
html中的指令。
脚步:
[ 1 ]bootstrapper.js
按照我在上面提到的已回答问题中的指示进行创建。基本上,它应该看起来像这样(注意:urlMap
如果需要在应用程序启动之前在其应用程序中添加更多设置,则可以在中添加更多配置url ):
angular.injector(['ng']).invoke(function($http, $q) {
var urlMap = {
$calendar: 'content/calendar.json'
};
var settings = {};
var promises = [];
var appConfig = angular.module('app.settings', []);
angular.forEach(urlMap, function(url, key) {
promises.push($http.get(url).success(function(data) {
settings[key] = data;
}));
});
$q.all(promises).then(function() {
bootstrap(settings);
}).catch(function() {
bootstrap();
});
function bootstrap(settings) {
appConfig.value('Settings', settings);
angular.element(document).ready(function() {
angular.bootstrap(document, ['app', 'app.settings']);
});
}
});
[ 2 ]假设您的主模块名称app
在app.js
:
angular.module('app', [])
.factory('DayService', function(Settings){
var calendar = Settings.$calendar,
season = calendar.seasons.season,
obj = {};
obj.season = function(d){
var day = new Date(d).getTime(),
start, end, value;
for (var i = 0; i < season.length; i++){
start = new Date(season[i].start);
end = new Date(season[i].end);
end.setHours(23,59);
if (day >= start && day <= end){
value = season[i].name;
break;
}
}
return value;
};
obj.weekInSeason = function(d){
var day = new Date(d).getTime(),
end, diff, start, startDiff, week;
for (var i = 0; i < season.length; i++){
end = new Date(season[i].end);
end.setHours(23,59);
end = end.getTime();
diff = end - day;
if (parseFloat(diff) > 0){
start = new Date(season[i].start);
start = start.getTime();
startDiff = day - start;
week = parseInt(startDiff /(1000*60*60*24*7))+1;
break;
}
}
return week;
};
return obj;
});
[ 3 ]控制器用法(示例):
angular.module('app')
.controller('SampleController', function(DayService) {
console.log(DayService.season(3));
console.log(DayService.weekInSeason(3));
});
另一个注意事项:.run()
用于检查Settings === null
-如果为true,则可以定向到错误页面或任何显示问题的页面(这意味着应用程序被引导,但请求的配置之一失败)。
更新:
我检查了您提供的链接,看来您使用的版本是AngularJS v1.0.8
,.catch()
在他们的$q
promise实现中没有方法。
解决此问题时,可以考虑以下选项:
-1将您使用的AngularJS版本更改为最新的稳定版本1.2.23。请注意,此选项可能会破坏您的某些代码,这些代码高度依赖于您使用的版本。
-2更改此块:
$q.all(promises).then(function() {
bootstrap(settings);
}).catch(function() {
bootstrap();
});
至:
$q.all(promises).then(function() {
bootstrap(settings);
}, function() {
bootstrap();
});
如果您已经有依赖于当前使用的AngularJS版本的现有代码,则此选项更安全。但是我建议您更改为当前的稳定版本,因为它具有比当前使用的更多的功能和修复程序。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句