AngularJS在Application.run方法上设置变量。以后在控制器、服务、html中使用

AngularJS在Application.run方法上设置变量。以后在控制器、服务、html中使用,angularjs,Angularjs,我需要为我的应用程序设置全局配置变量,并填充$http.get(url) 我可以在html中与{{appSettings.SomeValue}一起使用它。.run方法在.config之后执行的问题。在控制器中,appSettings未定义 我怎样才能让它在控制器中工作?或者生成全局变量,这些变量只会在启动时填充。不要使用此代码 这很棘手 我从来没有把这个代码放在我的应用程序里^^ 我找到的唯一方法是: 'use strict'; angular.module('app',

我需要为我的应用程序设置全局配置变量,并填充$http.get(url)

我可以在html中与{{appSettings.SomeValue}一起使用它。.run方法在.config之后执行的问题。在控制器中,appSettings未定义


我怎样才能让它在控制器中工作?或者生成全局变量,这些变量只会在启动时填充。

不要使用此代码

这很棘手 我从来没有把这个代码放在我的应用程序里^^ 我找到的唯一方法是:

'use strict';
            angular.module('app', [])
            .config(function () {

           })
           .run(function($rootScope,$timeout,Myconfig){
                $rootScope.config = {};
                Myconfig.get().then(function(data){   
                   $rootScope.config = data;
               });
           })
           .factory('Myconfig', function ($http,$q) {
                return {
                    get : function() {
                        var deferred = $q.defer();
                        $http.get('config.json')
                            .success(function (response) {
                                deferred.resolve(response);
                            })
                            .error(function(data, status, headers, config) {
                                deferred.reject([]);
                        });
                        return deferred.promise; 
                   } 
                }
          })
          .controller('MainCtrl',function($scope){
            $scope.$watch('config',function(){
                console.log($scope.config);
            });

          });
如果你盯着控制台看,你会发现 你不能在prod中使用此代码,至少我不能 查找any以使用承诺检索配置 从服务器

更新 我想是你的服务器吧 编写服务器端配置js 像

包括在您的页面中 而不是简单地做

app.constant('CONFIG',config)
更新

伪码

我想到的唯一明智的事情是:

$routeProvider.when('/', {
    controller: 'MyCtrl',
    resolve: {
        config: function(rootService) {
            return rootService.getApplicationConfig()
        }
    }
})

app.controller('MyCtrl', function ($scope,MyService,config) {
    MyService.set(config);       
});
app.controller('MyCtrl', function ($scope,MyService) {
    MyService.get();       
});
找到具有“值”的解决方案


终于找到了一个答案,如何创建JSON只有一次

在app.js中,其中app=angular.module add

    $provide.factory('appConfig', function ($q,rootService) {
        return rootService.getApplicationConfig();
    });
rootService.js

angular.module('projectApp').service('rootService', ['$http','$routeParams','API_URL',function ($http, $routeParams, API_URL) {
    return {
        getApplicationConfig: function() {
            var url = API_URL+'/config/settings.json';
            console.log(url);
            return $http.get(url);
        },
    };

}]);
angular.module('projectApp').controller('MainCtrl', ['$location','$scope','$routeParams','rootService','appConfig', function ($location, $scope, $routeParams, rootService, appConfig) {

    $scope.content = false;
    appConfig.success(
        function(data, status) {
            console.log(data.time);
            $scope.content = JSON.parse(data.config_homepage).content
        }
    );
最后,在控制器中执行以下操作

angular.module('projectApp').service('rootService', ['$http','$routeParams','API_URL',function ($http, $routeParams, API_URL) {
    return {
        getApplicationConfig: function() {
            var url = API_URL+'/config/settings.json';
            console.log(url);
            return $http.get(url);
        },
    };

}]);
angular.module('projectApp').controller('MainCtrl', ['$location','$scope','$routeParams','rootService','appConfig', function ($location, $scope, $routeParams, rootService, appConfig) {

    $scope.content = false;
    appConfig.success(
        function(data, status) {
            console.log(data.time);
            $scope.content = JSON.parse(data.config_homepage).content
        }
    );
}]))

在服务器端,我将时间推送到JSON。每次我使用“appConfig”时,它都显示相同的时间。这意味着该请求只发送到服务器一次


如果有人有更好的解决方案,请将其作为答案发布。

注意:不要使用.run()。该方法是异步运行的,您不会总是拥有数据

提供程序与AppController一起使用

例如:

声明值(在app.js中执行此操作):

appSettings现在是一种可注入服务。这样使用:

angular.module('ctrls.myCtrl', [])
.controller('myCtrl', ['appSettings', function(appSettings) {
    console.log(appSettings.myValue);
}]);
在应用程序启动时从服务器资源设置值

声明AppController(我通常在我的app.js中这样做):

在主html页面的主体中(启动css类显示某种加载屏幕):



只有在appCtrl加载了服务器设置之后,应用程序中的其余控制器才会加载到ui view=“main”中。这样,您就可以始终拥有应用程序设置。

将rootService放在工厂/服务/提供商中,而不是配置中。顺便说一句,我不会使用$rootScope,而是$window,总之,我会使用constant/value作为应用程序配置,这取决于对配置的承诺,这不是解决问题的方法,谢谢回复!你能发布你的代码吗?你是想从一些API响应中设置全局变量还是它是静态的?我也在寻找一种方法来实现这一点。app.js中的$q是什么?
angular.module('app', ['ui.router'])
.value('appSettings', { myValue: undefined })
angular.module('ctrls.myCtrl', [])
.controller('myCtrl', ['appSettings', function(appSettings) {
    console.log(appSettings.myValue);
}]);
.controller('appCtrl', ['rootService', 'appSettings', function (rootService, appSettings) {
var vm = this;
vm.loaded = false;

if (appSettings.myValue == undefined) {
    rootService.getApplicationConfig().success(
       function(data, status) {
           appSettings.myValue = data;
           vm.loaded = true;
       }
   );
}}]);
<div ng-controller="appCtrl as vm">
    <div class="boot" ng-show="!vm.loaded"></div>
    <div ng-if="vm.loaded" ui-view="main" role="main" class="main"></div>
</div>