【问题标题】:How to call a function from another controller in AngularJS? [duplicate]如何从AngularJS中的另一个控制器调用函数? [复制]
【发布时间】:2015-06-10 14:50:37
【问题描述】:

我需要在 AngularJS 的另一个控制器中调用一个函数。我该怎么做?

代码:

app.controller('One', ['$scope',
    function($scope) {
        $scope.parentmethod = function() {
            // task
        }
    }
]);

app.controller('two', ['$scope',
    function($scope) {
        $scope.childmethod = function() {
            // Here i want to call parentmethod of One controller
        }
    }
]);

【问题讨论】:

  • 将函数放入服务中,并将服务注入到两个控制器中。或者,如果第二个控制器作用域是第一个控制器作用域的子级,则直接调用它。
  • 这对我来说就像一个 XY 问题;虽然有几种方法可以调用另一个控制器上的函数,但确实很少有充分的理由必须这样做。也许描述您的实际问题比询问您尝试实施的解决方案更有帮助?在不同的控制器上调用函数并不是真正的“角度方式”。
  • 一个控制器是另一个控制器的子/孙子吗?或者他们是没有血缘关系的兄弟姐妹?

标签: angularjs controller angularjs-scope


【解决方案1】:

控制器之间的通信通过$emit + $on / $broadcast + $on 方法完成。

因此,在您的情况下,您想在控制器“二”中调用控制器“一”的方法,正确的方法是:

app.controller('One', ['$scope', '$rootScope'
    function($scope) {
        $rootScope.$on("CallParentMethod", function(){
           $scope.parentmethod();
        });

        $scope.parentmethod = function() {
            // task
        }
    }
]);
app.controller('two', ['$scope', '$rootScope'
    function($scope) {
        $scope.childmethod = function() {
            $rootScope.$emit("CallParentMethod", {});
        }
    }
]);

在调用$rootScope.$emit 时,您可以发送任何数据作为第二个参数。

【讨论】:

  • 太棒了!!它对我有用
  • 我可以使用 $rootScope.function_name(); 调用该函数;
  • 参数传递有一个小问题。这解决了我的一个大问题。谢谢
  • 我们不能像这样传递参数。第一个参数是事件,而第二个是数据。比如 $rootScope.$on("CallParentMethod", function(event,data){{});
【解决方案2】:

我不会使用从一个控制器到另一个控制器的功能。更好的方法是将通用功能移动到服务中,然后将服务注入两个控制器中。

【讨论】:

  • 这并不总是可能的
【解决方案3】:

您可以使用事件来提供您的数据。像这样的代码:

app.controller('One', ['$scope', function ($scope) {
         $scope.parentmethod=function(){
                 $scope.$emit('one', res);// res - your data
         }
    }]);
    app.controller('two', ['$scope', function ($scope) {
         $scope.$on('updateMiniBasket', function (event, data) {
                ...
         });             
    }]);

【讨论】:

  • 救命稻草。上面有一个答案,我跟着它,它几乎对我有用,但没有收到参数。他错过了如果我们想传递参数,我们需要做 $scope.$on('someMehotdName',function(event,data){});
【解决方案4】:

如果two 控制器嵌套One 控制器中。
然后你可以简单地调用:

$scope.parentmethod();  

Angular 将从当前范围开始搜索parentmethod 函数,直到到达rootScope

【讨论】:

    【解决方案5】:

    在两个控制器之间进行通信的最佳方法是使用事件。

    查看scope 文档

    在此查看$on$broadcast$emit

    【讨论】:

      【解决方案6】:

      如果你想在子控制器中执行父控制器的 parentmethod 函数,调用它:

      $scope.$parent.parentmethod();
      

      你可以试试here

      【讨论】:

        猜你喜欢
        • 2014-12-11
        • 2015-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多