【问题标题】:Second Controller not responding第二个控制器没有响应
【发布时间】:2017-10-12 10:10:55
【问题描述】:

由于某种原因,第二个控制器没有从服务接收数据。 我正在尝试使用一个服务在两个控制器之间进行通信。

观点:

  <div class="btn-wrapper" ng-controller="FirstController">
    <a ng-href="" ng-click="doPath()" id="go" class="button">GO!</a>
  </div>

FirstController.js:

angular.module('app')
.controller('FirstController', function($scope, sharedService) {

    $scope.doPath = sharedService.searchPath;
});

共享服务:

angular.module('myServices', [])
.service('sharedService', function($rootScope) {
  this.searchPath = function() {
    console.log("I got the service!");
    $rootScope.$broadcast('Search', {
      data: 'something'
    });
  }    
});

还有 SecondController.js

angular.module('app')
.controller('SecondController', function(sharedService, $scope) {
    $scope.$on('Search', function(event, data){
      console.log(data);
      //this.search(); => I intent to run this function after this
    });
});

该事件由视图中的一个按钮调度,该按钮调用doPath() 函数。此函数与服务sharedService 进行通信,并显示消息“我得到了服务”。

但是,应用程序在此停止。 Service 和第二个 Controller 之间使用 $rootScope.$broadcast 的通信似乎没有发生(数据没有显示在控制台上,也没有任何错误)。

我在这里找到了一些解决方案。我已经尝试了所有答案,所以问题不一样,原因仍然无法正常工作。

编辑

ngRoute 在这里(app.js):

angular.module('app', ['ngRoute', 'myServices'])
.config(function($routeProvider){

    $routeProvider
    .when('/', {
        templateUrl: 'views/main.html',
        controller: 'FirstController'
    })
    .otherwise({
        redirectTo: '/'
    });
});

【问题讨论】:

  • 只是一个想法...您正在向$rootScope 广播,但您的控制器在$scope 上有监听器。您是否尝试将 $rootScope 作为参数传递给控制器​​定义并将侦听器添加到其中?...
  • 乍一看,sharedService.searchPath 是一个函数,而您似乎并没有执行它。试试 $scope.doPath = sharedService.searchPath();
  • @David Espino,是的,我试过了。同样的结果...
  • @ruedamanuel 它显示“我得到了服务”,没有任何事件!但它一直停在同一个地方。似乎由于某种原因它没有到达第二个控制器。

标签: javascript angularjs


【解决方案1】:

正如大家所建议的,需要对第二个控制器进行“实例化”。

<div ng-controller="firstController">
    //code
</div>

<div ng-controller="secondController">
    //code
</div>

如上。

我知道您使用过“ngRoute”。在您更改视图之前,第二个控制器不会加载到“ngRoute”中,而在上面的代码中,两个控制器都在同一个视图中。这就是为什么上面的代码有效而 'ngRoute' 无效的原因。

【讨论】:

  • 但是我的 ngRoute 怎么样?我是否需要从那里排除控制器,并仅在 View 上实例化?或者我可以让它在那里(并使用两种方式)?我意识到同时使用它们都有效,但这是一个好习惯吗?
  • @Atoyansk 您可以使用任何一种方式。拥有控制器不是强制性的。
【解决方案2】:

SecondController 没有被 Angular 实例化,因为你只是从 html 中引用 FirstController。您需要根据您的应用程序使用父子关系或兄弟关系在同一个 html 上实例化 SecondController。

【讨论】:

  • 事实上,我并没有像我演示的那样实例化 FirstController(这是一种使其更具可读性的方法)。我确实使用 ngRoute。在那种情况下,我将如何实例化两个控制器?我编辑了我的问题,包括 ngRoute 代码。
  • 您可以按照您当前的设计使用 html,如下所示-
    GO!
猜你喜欢
  • 2016-09-25
  • 2017-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多