2014-04-03 18 views
3

在我的Angular.js應用程序中,我遇到了這樣的問題。我有服務被稱爲user,我把它叫做上app.run從服務器獲取用戶數據,像這樣:Angular.js - 在控制器中等待,直到服務返回來自服務器的值

app.run(function (user, tracking) { 
    user.initialize(); 
    ... // some other code goes here.. 
}); 

這只是簡單地調用API的路線,並創建$rootScope.user通過所有應用程序可用。

但不知何故控制器不時地加載更快,然後初始化去..和$rootScope裏面它不包含user對象。

function SomeController($scope, $rootScope, $routeParams) { 
    console.log($rootScope.user.name); 
    // sometimes returns error - 
    // TypeError: Cannot read property 'name' of undefined 
} 

所以,我怎麼能強迫所有控制器的負荷僅初始化爲$rootScope後順利。我不想在每個控制器中的用戶上添加$watch ..因爲它看起來像是一個糟糕的決定,並且使代碼變得醜陋。

您的建議?謝謝!

+0

你使用'ngRoute'嗎? Bcoz上面有「解決方案」,你可以使用它。 –

+0

@IqbalFauzi是的,我使用''ngRoute''。這是否意味着我需要在每個控制器的''resolve''內調用''user.initialize()''? – Kosmetika

回答

3

我的解決方案是使用$routeProvider.when()方法resolve選項。

這將防止控制器請求數據之前加載完成:

$routeProvider.when('/books', { 
    templateUrl: 'books', 
    controller: 'bookCtrl', 
    resolve: { 
    appUser: function (user) { 
     // we're injecting "user" service 
     // and initiliazing it (this method returns $promise) 
     return user.initialize(); 
    } 
    } 
}); 

而內部bookCtrl剛注入appUser作爲依賴。

2

我有同樣的問題。我發現的唯一解決方案是在rootScope中創建一些功能並從控制器調用它。所以app.run函數裏面類似的東西:

scope.initUser = function() { 
    if (!user){ 
    // create 
     user.initialize(); 
    } 
}; 

然後我的控制器調用它的開頭:

$rootScope.initUser(); 

不要忘記注入$ rootScope到控制器。

這種解決方案並不假裝是優雅,但至少它的工作原理...

如果有人提出更好的解決方案我將不勝感激......

相關問題