2016-04-07 211 views
1

我遇到了我的統計控制器的異步問題。我有一個控制器查詢數據庫並返回對象。在這個控制器中,我使用過濾器來獲取平臺Facebook的過濾器,並將其放入$rootScope.facebookObjects角度承諾

第一控制器:

app.controller('statsCtrl', function ($scope, $log, $http, $timeout, $filter, Data, $rootScope) { 
    Data.get('stats').then(function(data){ 
     $scope.stats = data.data; 
     $scope.currentPage = 1; //current page 
     $scope.filteredItems = $scope.stats.length; //Initially for no filter 
     $scope.totalItems = $scope.stats.length; 
     $scope.list_pages = [ 
       { 
        id: '5', 
        name: '5' 
       }, { 
        id: '10', 
        name: '10' 
       }, { 
        id: '20', 
        name: '20' 
       }, { 
        id: '50', 
        name: '50' 
       }, { 
        id: '100', 
        name: '100' 
       } 
      ]; 
     $scope.maxSize = 5; 

     $rootScope.facebookObjects = $filter('filter')($scope.stats, { platform: "facebook" }); 
     $rootScope.twitterObjects = $filter('filter')($scope.stats, { platform: "twitter" }); 
    }); 
    $scope.setPage = function(pageNo) { 
     $scope.currentPage = pageNo; 
    }; 
    $scope.filter = function() { 
     $timeout(function() { 
      $scope.filteredItems = $scope.filtered.length; 
     }, 10); 
    }; 
    $scope.sort_by = function(predicate) { 
     $scope.predicate = predicate; 
     $scope.reverse = !$scope.reverse; 
    }; 

}); 

我有使用$rootScope.facebookObjects來填充圖表的第二控制器。問題是我需要等到$rootScope.facebookObjects有一個值。目前我的控制檯日誌顯示未定義。我正在看諾言,但我有點不確定哪個控制器使用它,以及如何正確使用它。

第二個控制器:

app.controller("PieCtrl", function ($scope, $rootScope, $timeout, $log) { 
    $log.log('facebook - '+$rootScope.facebookObjects.length); 
}); 
+0

如果你想分享控制器之間的數據沒有數據連接到'$ rootScope',使用服務來代替。 – Ankh

+0

我對角度很陌生。你能告訴我如何做到這一點? – Jason

+0

嘗試[類似這樣的東西](http://stackoverflow.com/a/12513509/2043204) – Ankh

回答

0

謝謝大家的幫助。這是我根據你的答案提出的。

第一個控制器:

$scope.facebookObjects = $filter('filter')($scope.stats, { platform: "facebook" }); 
$scope.twitterObjects = $filter('filter')($scope.stats, { platform: "twitter" }); 

$scope.$broadcast('update_chart_controller', { 
    fb: $scope.facebookObjects, 
    tw: $scope.twitterObjects 
}); 

第二個控制器:

$scope.$on("update_chart_controller", function(event, args) { 
    $scope.data = [args.fb.length, args.tw.length]; 
}); 
0
$rootScope.$watch('facebookObjects', function(newValue, oldValue) { 
    //do your job 
}); 

,而你可以用$看着看着它,但我不知道它是共享控制器之間的數據的好方法,甚至更多的數據是acync 。

0

我已經爲您創建一個exampleangular factory

HTML:

<div ng-app="jsfiddle"> 
    <div ng-controller="MainCtrl"> 
     Data: {{data}}<br> 
    </div> 

    <div ng-controller="SecondCtrl"> 
     Data: {{data}}<br> 
    </div> 
</div> 

角:

var app = angular.module('jsfiddle', []); 

app.factory('myService', function($http) { 
    return { 
    async: function() { 
     return $http.get('https://api.myjson.com/bins/1v21f'); 
    } 
    }; 
}); 

app.controller('MainCtrl', function(myService,$rootScope, $scope, $timeout) { 
    $scope.data = "oron"; 
    myService.async().then(function(d) { 
    $timeout(function() { 
       $rootScope.data = d; 
      }, 1000); 

    }); 
}); 

app.controller('SecondCtrl', function($rootScope, $scope, $timeout) { 
    $scope.test = $rootScope.data; 

}); 

MainCtrl呼籲myService並存儲在$rootScope的響應。 然後當該值準備好時,它將更新SecondCtrl上的數據對象。