从一个控制器读取数据到另一个

时间:2017-11-04 19:34:48

标签: angularjs asp.net-mvc

我在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);
})

2 个答案:

答案 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,它显示了如何通过按钮点击向第二个控制器广播事件。

https://plnkr.co/edit/KzNftVAYwPuCvsnflIz