2016-04-07 106 views
0

請幫我解答我的問題。當我從父控制器調用並捕獲子控制器時,爲什麼不工作函數$ broadcast?

<!DOCTYPE html> 
 
<html lang="en" ng-app="app"> 
 
<head> 
 
    <meta charset="UTF-8"> 
 
    <title></title> 
 
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.3/angular.min.js"></script> 
 
    <script> 
 
     var app = angular.module('app', []); 
 
     app.controller('ctrl1', 
 
       function ($scope) { 
 
        $scope.$broadcast('parent', 'Some data'); 
 
       }); 
 

 
     app.controller('ctrl2', 
 
       function ($scope) { 
 
        $scope.$on('parent', function (event, data) { 
 
         console.log(data); // 'Some data' 
 
        }); 
 
       }); 
 
    </script> 
 
</head> 
 
<body> 
 
<div ng-controller="ctrl1"> 
 
    <div ng-controller="ctrl2"> 
 
    </div> 
 
</div> 
 
</body> 
 
</html>

回答

4
<!DOCTYPE html> 
<html lang="en" ng-app="app"> 
<head> 
    <meta charset="UTF-8"> 
    <title></title> 
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.3/angular.min.js"></script> 
    <script> 
     var app = angular.module('app', []); 
     app.controller('ctrl1', 
       function ($scope) { 
        $scope.$on("ready",function(){ 
         $scope.$broadcast('parent', 'Some data'); 
        }); 

       }); 

     app.controller('ctrl2', 
       function ($scope) { 
        $scope.$on('parent', function (event, data) { 
         alert(data); // 'Some data' 
        }); 
        $scope.$emit('ready'); 
       }); 
    </script> 
</head> 
<body> 
<div ng-controller="ctrl1"> 
    <div ng-controller="ctrl2"> 
    </div> 
</div> 
</body> 
</html> 
+0

這對我來說非常有用。謝謝! – Maksim

+0

有一個問題。爲什麼發射必須在最後一行?如果移動$發出高於$ scope。$就不行了。 – Maksim

+1

@ DK3基本上,當孩子控制器準備好時,首先要做一個'emit',然後從父母收聽,然後再使用它進行廣播。這是絕對不實際和不好的做法。這導致了兩次傳播。這是不必要的。 –

1

變化$scope.$broadcast('parent', 'Some data');

$scope.$broadcast('parent', {message:'Some data'}); 
+0

你的回答不正確! – Maksim

+0

否不需要將其作爲對象發送。見[this](https://fiddle.jshell.net/jsalaat/60x93g3j/2/),它只是孩子還沒準備好收聽。 –

1

我從你的代碼做了fiddle。當聽衆沒有準備好時,你只是在廣播你的消息。

只要在controller2準備好收聽時廣播您的消息。

var app = angular.module('app', []); 
app.controller('ctrl1', 
    function($scope, $timeout) { 
    $timeout(function() { 
     $scope.$broadcast('parent', 'Some data'); 
    }, 0) 
    }); 

app.controller('ctrl2', 
    function($scope) { 
    $scope.$on('parent', function(event, data) { 
     console.log(event, data); // 'Some data' 
    }); 
    }); 

希望這有助於

+0

你有任何替代變種,而不是超時? – Maksim

+0

''超時''這裏沒有必要,只是等待'ctrl2'被定義並進入其監聽模式。 基本上'ctrl2'是在**'ctrl1'裏面的**,'ctrl1'需要正確定義裏面的視圖。 現在當'ctrl1'裏面的代碼啓動監聽器沒有加載並且不處於它的狀態 –

+0

在發射情況下超時未被使用[fiddle](https://fiddle.jshell.net/jsalaat/60x93g3j/3/ ) –

相關問題