问题 如何在角度应用程序启动之前从.json文件加载一些设置


我正在构建使用CORS请求的应用程序。我使用的每个请求都从常量中获取主机地址

angular.module('siteApp').constant('baseUrl', {
'server':'htttp://localhost/',
})

在每个服务我用来发送这样的请求:

angular.module('siteApp').factory('DocsSvc', function ($http, baseUrl) {
   var baseurl = baseUrl.server ;
   $http.get(baseurl + 'document')

是否有可能使'htttp:// localhost /'值 - 来自config.json文件到baseUrl常量或baseUrl工厂? 我的意思是:我怎样才能从ajax请求中加载一些东西使其可以访问app模块

我努力了:

.run(['$rootScope', , function ($rootScope) {

  $.ajax('config.json', {async: false})
  .success(function (data) {
    $rootScope.HOST = data.HOST;
  });

并尝试从baseUrl访问它:

angular.module('siteApp').factory('baseUrl',function($rootScope) {
 return {
  server: $rootScope.HOST

但没有运气 - baseUrl.server未定义为函数


5510
2017-12-31 11:35


起源



答案:


您可以使用 run 角度方法。

  var app = angular.module('plunker', []);

  app.run(function($http, $rootScope){
  $http.get('config.json')
  .success(function(data, status, headers, config) {
    $rootScope.config = data;
    $rootScope.$broadcast('config-loaded');
  })
  .error(function(data, status, headers, config) {
    // log error
    alert('error');
  });
})

app.controller('MainCtrl', function($scope, $rootScope) {
  $scope.$on('config-loaded', function(){
    $scope.name = $rootScope.config.name;  
  });
});

看到这个 plunker


7
2017-12-31 11:44



请查看更新的问题:我曾尝试做过类似的事情,但没有成功 - happyZZR1400
查看更新的答案和plunker。有用 :) - vinesh
您需要仅为最初加载的控制器侦听config-loaded事件。因为在这种情况下,控制器在加载json文件之前被调用。 - vinesh
谢谢你努力帮助我。我修改了你的plunker更接近我的情况,它不能很好地工作:plnkr.co/edit/QfSzS0jbO8wRXwiM6T0W?p=preview 。无论如何 - 再次感谢你,似乎我更好地从服务器端渲染主机 - happyZZR1400


答案:


您可以使用 run 角度方法。

  var app = angular.module('plunker', []);

  app.run(function($http, $rootScope){
  $http.get('config.json')
  .success(function(data, status, headers, config) {
    $rootScope.config = data;
    $rootScope.$broadcast('config-loaded');
  })
  .error(function(data, status, headers, config) {
    // log error
    alert('error');
  });
})

app.controller('MainCtrl', function($scope, $rootScope) {
  $scope.$on('config-loaded', function(){
    $scope.name = $rootScope.config.name;  
  });
});

看到这个 plunker


7
2017-12-31 11:44



请查看更新的问题:我曾尝试做过类似的事情,但没有成功 - happyZZR1400
查看更新的答案和plunker。有用 :) - vinesh
您需要仅为最初加载的控制器侦听config-loaded事件。因为在这种情况下,控制器在加载json文件之前被调用。 - vinesh
谢谢你努力帮助我。我修改了你的plunker更接近我的情况,它不能很好地工作:plnkr.co/edit/QfSzS0jbO8wRXwiM6T0W?p=preview 。无论如何 - 再次感谢你,似乎我更好地从服务器端渲染主机 - happyZZR1400


如果您想在角度应用程序启动之前执行此操作,则可以使用引导程序函数而不是使用ng-app指令。

从: https://docs.angularjs.org/api/ng/function/angular.bootstrap

<!doctype html>
<html>
<body>
<div ng-controller="WelcomeController">
  {{greeting}}
</div>

<script src="angular.js"></script>
<script>
  var app = angular.module('demo', [])
  .controller('WelcomeController', function($scope) {
      $scope.greeting = 'Welcome!';
  });
  // Do your loading of JSON here
  angular.bootstrap(document, ['demo']);
</script>
</body>
</html>

2
2017-12-31 12:01





你需要告诉有关数据更改的角度,所以修改你的代码是这样的:

.run(['$rootScope', function ($rootScope) {

  $.ajax('config.json', {async: false})
  .success(function (data) {
    $rootScope.HOST = data.HOST;
    $rootScope.$apply();            // New line
  });
}])

$apply() 因为它是非角度异步调用所以是必需的。


1
2017-12-31 12:03