Angular JS正确的工厂结构

艾伦·吉莉安娜

我的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-apphtml中的指令。

脚步:

[ 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 ]假设您的主模块名称appapp.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()在他们的$qpromise实现中没有方法

解决此问题时,可以考虑以下选项:

-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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

angular.js工厂变量

来自分类Dev

Angular JS工厂内的访问范围

来自分类Dev

Angular.js按键事件和工厂

来自分类Dev

Angular js工厂调用“不是函数”

来自分类Dev

angular.js将函数注入工厂

来自分类Dev

使用工厂的Angular.JS API

来自分类Dev

将angular js服务/工厂注入Jasmine

来自分类Dev

Angular JS:异步工厂调用问题

来自分类Dev

工厂数据来不及了– Angular.js

来自分类Dev

Angular JS工厂调用“不是函数”

来自分类Dev

销毁Angular Js中的工厂对象

来自分类Dev

需要在 angular js 中工作的工厂

来自分类Dev

如何设计正确的 Angular 组件结构?

来自分类Dev

如何在Angular js中创建动态工厂?

来自分类Dev

Angular.js服务/带有可重用数据的工厂

来自分类Dev

工厂服务中的Angular Js事件/侦听器

来自分类Dev

Angular JS工厂vs服务vs提供程序示例

来自分类Dev

如何使用Jasmine在Angular JS工厂中测试变量

来自分类Dev

如何在Angular JS的工厂/服务中使用$ cookie?

来自分类Dev

Angular.js服务/带有可重用数据的工厂

来自分类Dev

Angular JS从控制器中的工厂访问$ http数据

来自分类Dev

Angular JS-隐藏工厂中的私有变量

来自分类Dev

控制器(ANGULAR JS)无法读取工厂嵌套的数据

来自分类Dev

Angular.js在服务/工厂内部获取输入数据

来自分类Dev

(离子框架)另一个工厂的Angular JS过滤器工厂?

来自分类Dev

.Net MVC 5中的Angular js结构

来自分类Dev

Angular无极工厂

来自分类Dev

如何扩展Angular工厂

来自分类Dev

Angular在工厂编译