2015-10-18 53 views
1

我有關於AngularJS的問題。我想對某些數組進行ng-repeat。但是這個數組的數據是從控制器中的firebase獲得的。 問題是,當頁面呈現時,iam仍在等待從異步函數獲取來自firebase的數據。角度,停止渲染,直到獲取異步數據

什麼是控制它的最好方法? 我試着使用promisses,但是在我從firebase獲取數據之前,出現了一些錯誤和頁面。

$scope.games = []; 
    function getOnce(){ 
     var defer = $q.defer(); 
     ref.once("value", function(data) { 
      defer.resolve(); 
      $scope.games.push('test'); 
     }); 
     return defer.promise; 
    } 

    $scope.getdata = getOnce().then(function(data){ 
     console.log('success'); 
     console.log(data); 

    }); 

我呼籲初始化 '$ scope.getdata' 功能 '數據-NG-的init = 「的GetData()」' 我錯在這裏?或者我怎樣才能實現我的目標?

+0

這是異步/承諾是如何工作的。異步的關鍵在於在服務器請求正在進行時可能發生其他事情(如頁面呈現)。但是你在這裏發佈的代碼並不能真正顯示你的問題真的是什麼,因爲它似乎並沒有使用任何試圖獲得的數據。 – Claies

+0

不應該使用'ng-init'來觸發控制器功能,請在控制器中調用它。另外'resolve'不會將任何數據傳遞給承諾鏈 – charlietfl

+0

您的'getdata'屬性不是函數,它是一個承諾對象。 –

回答

1

在方法解析中傳遞數據。然後用數據響應填充數組。

$scope.games = []; 
    function getOnce(){ 
     var defer = $q.defer(); 
     ref.once("value", function(data) { 
     defer.resolve('test'); 
    }); 
    return defer.promise; 
} 

$scope.getdata = getOnce().then(function(data){ 
    $scope.games.push(data); 
    console.log('success'); 
    console.log(data); 
}); 
+0

這是我的解決方案,謝謝! – Filip

0

那麼您可以使用ng-show來隱藏您在加載數據時不想看到的頁面部分。或者如果您的指令要求數據在按角度運行時加載數據,則可以使用ng-ifng-ifng-if

這是否適合您的需求?


你需要暴露與否大功告成加載到$scope像這樣的東西:

$scope.isDoneLoading = false; 
$scope.getdata = getOnce().then(function(data){ 
    // ... 
    $scope.isDoneLoading = true; 
}); 

那麼你就只是這樣做:

ng-if="isDoneLoading" 

或者,根據您的需要:

ng-show="isDoneLoading"