予選
私はangularjsを使用してWebアプリを開発しています。ある時点で、私のメインコントローラーはデータを継続的に送信するWebサービスに接続します。使用しているストリームをキャプチャして処理するには(http://ajaxpatterns.org/HTTP_Streaming)。すべてが魅力のように機能します。これらのストリーミングデータを、jqueryチャートライブラリを介して処理および表示する別のコントローラーと共有したいと思います(どちらを使用するかはまだ決定されていませんが、この質問の範囲外です)。これらのデータを共有するために、私はこのjsfiddle(http://jsfiddle.net/eshepelyuk/vhKfq/)をフォローしました。
以下に私のコードのいくつかの関連部分を見つけてください。
モジュール、ルート、およびサービス定義:
var platform = angular.module('platform', ['ui']);
platform.config(['$routeProvider',function($routeProvider){
$routeProvider.
when('/home',{templateUrl:'partials/home.html',controller:PlatformCtrl}).
when('/visu/:idVisu', {templateUrl: 'partials/visuTimeSeries.html',controller:VisuCtrl}).
otherwise({redirectTo:'/home',templateUrl:'partials/home.html'})
}]);
platform.factory('mySharedService', function($rootScope) {
return {
broadcast: function(msg) {
$rootScope.$broadcast('handleBroadcast', msg);
}
};
});
PlatformCtrlの定義:
function PlatformCtrl($scope,$http,$q,$routeParams, sharedService) {
...
$scope.listDataVisu ={};
...
$scope.listXhrReq[idVisu] = createXMLHttpRequest();
$scope.listXhrReq[idVisu].open("get", urlConnect, true);
$scope.listXhrReq[idVisu].onreadystatechange = function() {
$scope.$apply(function () {
var serverResponse = $scope.listXhrReq[idVisu].responseText;
$scope.listDataVisu[idVisu] = serverResponse.split("\n");
sharedService.broadcast($scope.listDataVisu);
});
};
$scope.listXhrReq[idVisu].send(null);
var w = window.open("#/visu/"+idVisu);
$scope.$on('handleBroadcast', function(){
console.log("handleBroadcast (platform)");
});
}
VisuCtrlの定義:
function VisuCtrl($scope,$routeParams,sharedService) {
$scope.idVisu = $routeParams.idVisu;
$scope.data = [];
/* ***************************************
* LISTENER FOR THE HANDLEBROADCAST EVENT
*****************************************/
$scope.$on('handleBroadcast', function(event,data){
console.log("handleBroadcast (visu)");
$scope.data = data[$scope.idVisu];
});
}
注入:
PlatformCtrl.$inject = ['$scope','$http','$q','$routeParams','mySharedService'];
VisuCtrl.$inject = ['$scope','$routeParams','mySharedService'];
問題の定義
このコードを実行すると、コントローラーのみがイベントPlatformCtrl
をリッスンしているように見えます。handleBroadcast
実際、コンソールを見ると、表示されるのはhandleBroadcast (platform)
新しいデータが到着するたびだけです。公式ドキュメントを読んだので、とても驚いてい$broadcast
ます。
イベント名をすべての子スコープ(およびその子)に下向きにディスパッチして、登録されたng。$ rootScope.Scope#$onリスナーに通知します。
特定のアプリのすべてのスコープはから継承するため、新しいデータがブロードキャストされるたびに関数inが起動されない$rootScope
理由がわかりません。$on
VisuCtrl