2014-02-27 139 views
14

我想分享兩個控制器之間的信息$scope.$on$scope.$broadcast

這裏是視圖:

<div ng-controller="ParentCtrl"> 
    <div ng-controller="ChildCtrl"> 
     {{content}} 
    </div> 
</div> 

和控制器:

.controller('ParentCtrl', ['$scope', function($scope) { 
    $scope.$broadcast('someEvent', 'bidule'); 
}]) 

.controller('ChildCtrl', ['$scope', function($scope) { 
    $scope.$on('someEvent', function(event, b) { 
     $scope.content = b; 
    }); 
}]) 

plunker

什麼我錯在這裏做什麼?

+2

嘗試從觸發您的$廣播()NG單擊或東西。也許在「控制器啓動」時執行它對於子控制器來說太快了。我會嘗試它,但我在電話上,並且plunkr在一個小設備上不能很好地工作:) –

回答

41

子控制器尚未實例化。包裹在timeout作品broadcasthttp://plnkr.co/edit/MF7P16K1OTv46JNgkkih?p=preview

$timeout(function(){ 
    $scope.$broadcast('someEvent', 'bidule'); 
}); 
+8

這似乎是一個糟糕的黑客攻擊。它不起作用,除非我在我的大型應用程序中添加一個500 ms的延遲。 –

+1

如果這是一個糟糕的黑客攻擊,那麼在Angular 1.x中如何正確解決這個問題? – jaycer

3

廣播一個事件,你只需要調用它。

下面的代碼工作完美:

您的看法:

<div ng-controller="ParentCtrl" ng-click="myFunc()"> 
    <div ng-controller="ChildCtrl"> 
     {{content}} 
    </div> 
</div> 

和你的控制器:

.controller('ParentCtrl', ['$scope', function($scope) { 
    $scope.myFunc = function() { 
     $scope.$broadcast('someEvent', 'bidule'); 
    } 
}]) 

.controller('ChildCtrl', ['$scope', function($scope) { 
    $scope.$on('someEvent', function(event, b) { 
     $scope.content = b; 
    }); 
}]) 

希望它能幫助!

+1

我想從parentctrl調用$ scope.myFunc我怎麼做,而不是HTML文件 –

5

孩子沒有啓動。面對同樣的問題,這是我的解決方案。

.controller('ParentCtrl', ['$scope', function($scope) { 
    $scope.$on('initiateEvent', function(event, b) { 
     $scope.$broadcast('someEvent', 'bidule'); 
    } 
}]) 
.controller('ChildCtrl', ['$scope', function($scope) { 
    $scope.$on('someEvent', function(event, b) { 
     $scope.content = b; 
    }); 
    $scope.$emit('initiateEvent', null); 
}]) 

在這裏,我發起的孩子,並要求家長廣播someEvent