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