我在ASP.NET MVC
项目中有两个控制器和两个视图。我的要求是在 ng-click 上将数据从一个控制器传递到另一个控制器,这应该反映在另一个视图中(以及另一个控制器)。简单!我知道,可以使用服务完成,但我更倾向于测试目的$broadcast
和$on
。所以我尝试了以下内容:
app.controller('FirstController', function ($rootScope, $scope, productService) {
$scope.showData = function (m) { //This is the event on which I'll get data in another controller as well in another view
alert(m); //This works and gets a name from the first view
$rootScope.$broadcast('sample', $scope.m); //This is what I am using to deliver in another controller
}
});
app.controller('SecondController', function ($scope) {
$scope.$on('sample', function (events, d) {
alert(d);
})
在另一种观点中,我使用了这样的东西:
<div ng-app="app" ng-controller="SecondController">
<ul class="nav navbar-nav">
<li><a href="#"> Product {{ m }}</a></li>
</ul>
</div>
其实我这样做是为了演示目的。但不幸的是,上述方法无效。我错过了什么吗?
更新1 - 请参阅更新后的代码:
app.controller('FirstController', function ($rootScope, $scope, productService) {
$scope.showData = function (m) { //This is the event on which I'll get data in another controller as well in another view
alert(m); //This works and gets a name from the first view
$timeout(function () {
$scope.$broadcast('sample', m);
});
}
});
app.controller('SecondController', function ($scope) {
$scope.$on('sample', function (events, d) {
alert(d);
})
答案 0 :(得分:1)
在您的方案中,它不适用于一种情况:
您之前致电$rootScope.$broadcast('sample', $scope.m);
$scope.$on()
已注册为'sample
事件a.e.在SecondController
创建之前。
如果您知道SecondController
已创建,则可以使用$rootScope.$broadcast('sample', $scope.m);
打包$timeout
。 a.e:
$timeout(function(){
$rootScope.$broadcast('sample', $scope.m);
});
在这种情况下,$broadcast
执行将被移动到事件结束队列a.e.在下一个摘要周期之前,将保证已创建第二个控制器并注册了$scope.$on()
。
答案 1 :(得分:1)
目前还不完全清楚你如何使用第二种观点&amp;控制器。它是否在FirstController
分配给模板的某个位置?查看分配给FirstController
的模板有助于澄清。在任何情况下,我都附上了一个简单的plunker,它显示了如何通过按钮点击向第二个控制器广播事件。