2016-09-28 109 views
0

我試圖從一個控制器生成廣播事件,並聽取它的另一個。但是結果沒有顯示在DOM上,儘管沒有錯誤。而且當我顯示正在工作的兩個控制器的正常$ scope變量。就在廣播和不工作並且沒有任何錯誤,所以我不強麥到debugg廣播事件,並不在角js

oneApp.controller("twoController",["$log","$scope","$rootScope",function($log,$scope,$rootScope){ 
var str ="sent from twoController "; 
$scope.hey = 215; 
$rootScope.$broadcast("hey",str); 

}]) 

oneApp.controller("twoChildController", ["$log","$scope","$rootScope",function($log,$scope,$rootScope){ 
//var str ="sent from twoController "; 
//$scope.display = str; 
$scope.$on("hey",function(event,str){ 
$scope.display = str; 
}); 

}]) 

所以可能有人請幫我解決這個問題?

+0

嘗試'$範圍$父$廣播( 「哎」,STR);' –

+0

也許刪除'event'從$的函數參數的參數。 – Masterakos

+0

$ scope中的函數是否被調用?你可以用console.log(「Callback being called」)來檢查它。請檢查它並告訴我們日誌是否顯示在控制檯中。謝謝。 –

回答

0

在這種情況下,控制器1首先啓動,然後啓動控制器2。當控制器1啓動的廣播事件發生時,控制器2尚未啓動,即$尚未註冊。您可以使用$超時。

var app = angular.module("myApp",[]); 
 

 
//controllers declaration 
 
app.controller('myCtrl1',function($scope, $rootScope, $timeout){ 
 
    $scope.name = "Roger"; 
 
    
 
    $timeout(function(){ 
 
    $rootScope.$broadcast('hey',$scope.name); 
 
    });  
 
    
 
}); 
 

 
app.controller('myCtrl2',function($scope, $rootScope){ 
 
    $scope.$on('hey',function(event,name){ 
 
     $scope.name=name; 
 
    }); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<body ng-app="myApp"> 
 

 
<div class="div1" ng-controller="myCtrl1"> 
 
    <span>myCtrl1 : {{name}}</span> 
 
</div> 
 

 
<div class="div2" ng-controller="myCtrl2"> 
 
    <span>myCtrl2 : {{name}}</span> 
 
</div> 
 
    
 
</body>

+0

這是確切的問題:)它現在工作,謝謝。只有一點疑問,當我們使用$ timeout服務而沒有任何延遲時會發生什麼?它是否立即超時並且回調函數被調用? – titlu

+0

$ timeout將您的工作放入隊列中,以便在當前摘要循環之後運行。 – ram1993

+0

是的,我知道我只想知道我們提供什麼時候我們不提供任何東西 – titlu

0

嘗試在給定的方式:

定義所有的廣播在像一些主控制器:

$rootScope.broadcast.actions = { 
     hey : 'hey' 
     //all broadcast 
} 

廣播發送:

$rootScope.$broadcast($rootScope.broadcast.actions.hey,{str}); 

廣播接收:

$scope.$on($rootScope.broadcast.actions.hey, function (event,str){ 
    $scope.display = str; 
});