2014-11-14 95 views
0

我正在使用AngularJS,我需要一個全局的幾個全局對象,可以被任何控制器在應用程序中訪問。AngularJS中的異步全局變量

例如,我需要的一個對象是具有用戶ID和其他屬性的用戶對象。這個用戶對象來自數據庫,通過ajax。所以我需要一種方法來設置該用戶對象,然後初始化頁面上使用的控制器。基本上給應用程序一個頁面加載程序的第一次加載。

然後,如果該對象沒有設置,我需要重定向。

有沒有人有如何幹淨地做到這一點的想法?我一直在試圖使用廣播,但它的修飾意大利麪代碼。

目前我使用ui路由器,並有一個隱藏的視圖與控制器GlobalsCtrl。 GlobalsCtrl使用服務來獲取對象,然後$廣播它們以便控制器可以初始化。但是......此廣播只適用於初始網站加載。當更改$ location.paths時,由於已設置GlobalsCtrl變量,所以未廣播該事件。

我可以添加一些if語句,但對我來說似乎很混亂。

請幫忙。謝謝!


Plunker - http://plnkr.co/edit/TIzdXOXPDV3d7pt5ah8i

var app = angular.module('editor.services', []); 
app.factory('AnalysisDataService', ['$http', function($http) { 
    var self = this; 

    self.activeAnalysis = {}; 

    self.openAnalysis = function(analysisId) { 
     return $http.get('api/v1/assignments/analysis/' + analysisId) 
      .success(function(data, status, headers, config) { 
       self.activeAnalysis = data; 
       return self.activeAnalysis; 
      }).error(function(data, status, headers, config) { 
       console.log("Error could not load analysis article."); 
      }).then(function(result) { 
       return self.activeAnalysis; 
      }); 
    }; 

    self.getAnalysis = function() { 
     return self.activeAnalysis; 
    }; 

    self.navigateToStep = function(step) { 
     $location.path('/analysis/summary'); 
    };   

    return { 
     open: self.openAnalysis, 
     get: self.getAnalysis, 
     navigate: self.navigateToStep, 
    } 
}]); 

問題是我需要一些其他的控制器的負載之前要設置的self.activeAnalysis變量。每個頁面根據analysisId加載一個不同的數據集。

+3

顯示您目前擁有的一些代碼。聽起來你只是想要一個共享服務,你可以在整個板子上注入。 – tymeJV 2014-11-14 16:01:14

+2

[angular service](https://docs.angularjs.org/guide/services)是爲所有控制器/指令獲取共享對象的正確概念。角度服務是單身漢。例如,您可以使用'$ http'服務處理所有AJAX請求,使用'$ cookies'服務來讀取/寫入瀏覽器cookie。您可以創建一個「用戶」服務來讀取所有控制器的訪問者信息。 – shawnzhu 2014-11-14 16:15:32

+0

嗨,我用我的文件添加了一個Plunker:http://plnkr.co/edit/TIzdXOXPDV3d7pt5ah8i – RachelC 2014-11-14 16:16:02

回答

1

的一件事是使用路線上的resolveui.router,確保在轉換到新狀態之前解決任何承諾。事情是這樣的:

.state('app.mymodule', {url: '/my-route/', 
    views:{ 
     'someView': { 
     templateUrl: '/views/someView.html', 
     controller: 'someController' 
     } 
    }, 
    resolve: { 
     someResolve: function (someService) { 
     return someService.getUserInfo(); 
     } 
    } 
    }) 

這裏,$http呼叫someService.getUserInfo()做將過渡到狀態之前解決。在該方法內部,只需在服務中設置響應中的數據,並將其在控制器中提供。