2015-07-10 45 views
1

我有一個SPA。我有一些基本的初始化數據,我從服務器中獲取,我確定我希望推遲每個頁面加載,直到數據加載。 (這些數據包含用戶是否已登錄,權限以及其他重要內容)。因此,如果我有用於獲取和訪問該數據的服務,頁面控制器可能會在獲取數據之前開始執行,這是不好的。推遲執行聚集

我也不能使用一個承諾,部分是因爲它並沒有解決我的問題,我不想讓頁面開始加載,部分是因爲它不能很容易地更新,我不想始終使用一個承諾來獲取這個基本數據

這是我試過到目前爲止:

我的服務

app.factory('AppData', function($q, $http){ 

    var appData = {}; 

    $http 
     .post("/api/GeneralActions/getInitData", { 
     }).success(function (data, status, headers, config) { 
      appData = data; 
     }).error(function (data, status, headers, config) { 
     }); 

    return { 
     getAppData: function() { 
      return appData; 
     } 
    }; 
}); 

我的頁面控制器:

app.controller('MainPreferences', function($scope, AppData){ 

    // when this gets executed, appData is null 
    $scope.appData = AppData.getAppData(); 

}); 

回答

1

嘗試下面的代碼片段

app.factory('AppData', function($q, $http){ 

    var appData = {}; 

    $http 
     .post("/api/GeneralActions/getInitData", { 
     }).success(function (data, status, headers, config) { 
      //appData = data; 
      angular.extend(appData, data); 
     }).error(function (data, status, headers, config) { 
     }); 

    return { 
     getAppData: function() { 
      return appData; 
     } 
    }; 
}); 

而是再次創造AppData的對象,只需用數據來擴展它。通過這種方式你的appData對象指針不會改變,控制器也會得到更新。

+0

最後我用這個小動作。很簡單,乾淨 –

0

是否使用ngRoute?如果是這樣,這聽起來像你想要的是你的路線上有一個解析屬性,要求他們加載一些東西,然後再改變路徑到新路線。

the ngRoute docs和搜索resolve

0

如果您正在使用股票Angular ngRoute路由系統,則可以使用the resolve property on the route指定承諾返回函數的映射。在這些承諾全部解決之前,路由控制器不會被初始化,作爲獎勵,承諾的結果被注入到路由控制器中。

例如:

$routeProvider.when('/foo', { 
    controller: 'fooCtrl', 
    resolve: { 
    bar: function($http) { return $http.get('/load/the/bar'); } 
    } 
}); 

// bar is injected from the route resolve 
myApp.controller('fooCtrl', function($scope, bar) { 
    $scope.bar = bar; 
}); 
+0

,他說,他不希望調用此API每次。 – dhavalcengg

+0

但是這個應用程序的數據適用於所有路線......我不想重複所有路線 –

0

我覺得應該是:

app.factory('AppData', function($q, $http){ 

    var appData = {}; 

    return { 
     getAppData: function() { 
      $http.post("/api/GeneralActions/getInitData", {}).success(function (data, status, headers, config) { 
        return data; 
      }).error(function (data, status, headers, config) { 

      }); 
     } 
    };  
});