【问题标题】:AngularJS - Inter-controller function execution using eventsAngularJS - 使用事件执行控制器间函数
【发布时间】:2015-08-17 12:17:10
【问题描述】:

所以我在一个模块中有 2 个控制器,每个控制器都有自己的职责,因为我正在制作一个实时功能,所以如果正在执行一个操作,我需要让两个控制器的数据保持同步。我遇到了 angular 的 $emit$on,它说我可以通过发出事件来触发函数。我已按照有关如何实施触发器的说明和指南进行操作,但不知何故我无法使其工作。

基本上我想做的是,我有 2 个控制器,CtrlACtrlB。这两个控制器都有很多功能,比如CtrlAactionACtrlAactionBCtrlBactionACtrlBactionB。根据stackoverflow中的一些其他指南,当CtrlB中的CtrlBactionB被调用时,它应该同时触发CtrlA中的CtrlAactionB,但我无法设法触发这样的动作。它只会在CtrlB中执行CtrlBactionB

app.controller('CtrlA', function($scope) {
  $scope.ctrlAdataA;
  $scope.ctrlAdataB = 0;

  $scope.ctrlAactionA = function (){
    $scope.ctrlAdataA = 'This is the original data.';
  }

  $scope.ctrlAactionB = function (){
    $scope.ctrlAdataA = 'Someone clicked the button in B so I changed!';
    $scope.ctrlAdataB++;
  }

  $scope.$on('buttonClicked', function(event, args) {
        $scope.ctrlAactionB();
    });
});

app.controller('CtrlB', function($scope) {
  $scope.ctrlBdataA;
  $scope.ctrlBdataB = 0;

  $scope.ctrlBactionA = function (){
    $scope.ctrlBdataA = 'I\'ve been clicked!';
    $scope.ctrlBdataB++;
    $scope.$emit('buttonClicked');
  }
});

这是我为模拟我描述的场景而制作的plunkr 文件。

【问题讨论】:

    标签: angularjs


    【解决方案1】:

    由于您尝试实现事件,因此您必须使用 $broadcast 而不是 $emit,并且您必须从父范围(即 $rootScope)执行此操作,因为 $broadcast 向下调度事件。因此,在 CtrlB 控制器中将这一行:$scope.$emit('buttonClicked'); 更改为这一行:$rootScope.$broadcast('buttonClicked');,并在 CtrlB 控制器中添加 $rootScope 作为依赖项。

    这是一个实施了更改的 plunker

    plunkr

    $emit 没有工作,因为 $emit 向上调度了一个事件,但它在那里找不到 CtrlA。 更多信息:AngularJS Emit

    【讨论】:

      【解决方案2】:

      我发现这与您的问题有关:https://stackoverflow.com/a/19468749/5235299

      希望对你有所帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多