2016-04-07 26 views
1

İstatistik denetleyicim ile eşzamanlı olmayan bir sorunla karşılaşıyorum. Ben db sorgular ve nesneleri döndüren bir denetleyici var. Bu denetleyicide, platform Facebook'u kullanarak filtreyi kullanıyorum ve bunu $rootScope.facebookObjects'a koydum.Köşeli vaatler

Ana kontrolör:

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; 
    }; 

}); 

Tabloyu doldurmak için $rootScope.facebookObjects kullanan bir ikinci kontrolör bulunmaktadır. Sorun, $rootScope.facebookObjects'un bir değere sahip olmasını beklemem gerek. Şu anda konsol günlüğüm tanımsız gösteriyor. Sözlere bakıyorum ama hangi denetleyiciyi kullanacağını ve düzgün şekilde nasıl kullanacağımı biraz emin değilim.

İkinci Denetleyici:

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

Eğer '$ rootScope' üzerine veri eklemek yok denetleyicileri arasında veri paylaşmak isterseniz, bunun yerine bir hizmeti kullanmak. – Ankh

+0

Açısal olarak çok yeni. Bunu nasıl yapacağımı gösterebilir misin? – Jason

+0

[Bunun gibi bir şey] deneyin (http://stackoverflow.com/a/12513509/2043204) – Ankh

cevap

0

Yardımlarınız için herkese teşekkür ederiz. İşte cevaplarınızdan yola çıkmış olduğum şey.

İlk Denetleyici:

$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 
}); 

İkinci Denetleyici:

$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 
}); 

bunu izlemek için izlemek $ kullanabilirsiniz, ama bu bir denetleyicileri arasında veri paylaşmak için iyi bir yol ve hatta daha fazla veri olduğundan emin değilim iken acync olduğunu .

0

Ben angular factory sizin için bir example yarattık:

HTML:

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

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

Açısal:

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; 

}); 

MainCtrlmyService arayıp $rootScope üzerine tepkisini saklamak edilir. sonra değer hazır olduğunda, SecondCtrl üzerindeki veri nesnesini güncelleyecektir.