2015-10-13 35 views
0

因此,我們正在開發具有Firebase後端的角度應用程序。我遇到了我們正在執行的特定功能的問題。基本上它是每次選擇不同的選項時,showData()函數觸發以從Firebase中檢索相關數據(並且它有效)。問題在於ng-repeat僅在第一次選擇更改時更新。連續的選擇更改不會反映在ng-repeat中(儘管數據已被檢索,因此模型已更改)。ng-repeat在模型更改後不會更新

查看:

<div class="container" ng-controller="dataController"> 
... 
    <select ng-model="selectedOption" ng-change="showData()"> 
     <option ng-repeat="entry in transactions" ng-value="entry.serial">{{ entry.serial }}</option> 
    </select> 
    </div> 
    <div class="col-md-9"> 
    <table class="table table-hover table-striped table-condensed"> 
    ... 
    <tbody> 
     <tr ng-repeat="entry in dataHistory"> 
     <td>{{ entry.id }}</td> 
     <td>{{ entry.timestamp | date:"yyyy MMM dd 'at' h:mm:ssa" }}</td> 
     <td>{{ entry.amount }}</td> 
     </tr> 
    </tbody> 
    </table> 
</div> 

控制器:

... 
.controller('dataController', ['$scope', '$firebaseArray', function($scope, $firebaseArray) { 
    ...  
    $scope.showData = function() { 
     $scope.dataHistory = []; 
     transfersRef.orderByChild('serial').equalTo($scope.selectedOption).on('child_added', function(snap) { 
     transactionsRef.orderByKey().equalTo(snap.val().transactionID).on('child_added', function(data) { 
      var entry = {}; 
      entry = data.val(); 
      entry.id = data.key(); 
      usersRef.child(entry.fromUserId).child('name').once('value', function(nameSnap) { entry.fromUsername = nameSnap.val(); }); 
      usersRef.child(entry.toUserId).child('name').once('value', function(nameSnap) { entry.toUsername = nameSnap.val(); }); 
      console.log('entry: \n' + entry); 
      $scope.dataHistory.push(entry); 
     }); 
     }); 
    }; 
    }]) 
... 

回答

0

嘗試在你的代碼$scope.dataHistory.push(entry);後申請$scope.$apply()

這是因爲您的數組更新代碼可能超出角度摘要循環。

+0

它在控制器內部不需要$ apply,實際上如果應用它會引發錯誤。 –

+0

好的,你是否在推送新條目後嘗試過console.log($ scope.dataHistory)?它顯示了什麼? –

+0

它顯示「過早的最終結果」,我期待這一點,因爲數據檢索是異步的。它只缺少一些字段,但我認爲它不應該導致視圖不更新。 –