2014-02-22 37 views
2

我需要爲我的應用程序設置全局配置變量填充$ http.get(url);AngularJS在應用程序.run方法中設置變量。後來在控制器,服務,使用html

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

    rootService.getApplicationConfig().success(
     function(data, status) { 
      $rootScope.appSettings = data; 
     } 
    ); 

我可以在帶{{appSettings.SomeValue}}的html中使用它。在.config之後執行.run方法的問題。而在控制器中,appSettings是未定義的。

我怎樣才能在控制器中工作?或者創建全局變量,只有在啓動後纔會填充全局變量。

+1

把你的rootService放在一個不在config中的工廠/服務/提供者。順便說一句,我不會使用$ rootScope,但$窗口和所有我會使用常數/值的應用程序配置依賴於承諾的配置它不是要走的方式imo – Whisher

+0

感謝您的答覆!你能發佈你的代碼嗎? – ivanproskuryakov

+0

我更新了我的回覆 – Whisher

回答

1

DONT使用此代碼

這是非常棘手的 ,我從來沒有把這個代碼在我的應用程序^^ 我發現的唯一方法是:

'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中使用此代碼,至少我不會使用 找到任何使用承諾從服務器檢索配置 的配置。

UPDATE 我想這是你的服務器,以便 寫入服務器端配置JS 像

var config = {prop:1}; 

在您 頁面,不是簡單地做

app.constant('CONFIG',config) 

UPDATE

僞代碼

唯一明智的事情,我想:

$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();  
}); 
0

找到解決方案與 「價值」

.value('appConfig',{ 
      apiUrl: '/api', 
      settings: null 
    }) 

    .run(['$http', '$rootScope','rootService','appConfig', function($http, $rootScope, rootService,appConfig) { 

     console.log(appConfig); 
     appConfig.settings = 'we can change it'; 
     console.log(appConfig); 


}]) 
+0

垃圾!控制器首先運行... – ivanproskuryakov

0

終於找到了答案如何製造商只JSON一次!

在app.js,其中,app = angular.module添加

$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 
     } 
    ); 

}]);

在服務器端,我將時間推送到我的JSON。每次我使用「appConfig」時,它都會顯示同一時間。這意味着請求只能發送到服務器一次。


如果有人有更好的解決辦法,請張貼的答案

+0

我正在尋找一種方法來做到這一點。 app.js中的$ q是多少? – mark1234

1

注:請不要使用.RUN()。該方法運行異步,你不會總是有你的數據!

使用提供商與AppController的

例子:

聲明一個(在app.js做到這一點):

angular.module('app', ['ui.router']) 
.value('appSettings', { myValue: undefined }) 

的appSettings現在是可注射的服務。像這樣使用:

angular.module('ctrls.myCtrl', []) 
.controller('myCtrl', ['appSettings', function(appSettings) { 
    console.log(appSettings.myValue); 
}]); 

設置應用程序啓動時服務器資源的值。

聲明的AppController(我通常做這在我的app.js):

.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; 
     } 
    ); 
}}]); 

在你的主HTML頁面的主體(啓動 CSS類顯示某種加載屏幕) :

<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> 

在應用程序中的控制器的其餘部分被裝載在UI視圖=「主」,則appCtrl已加載後才您的服務器設置。這樣你總是有你的appSettings。

相關問題