【问题标题】:Call function from another Controller Angular Js从另一个控制器 Angular Js 调用函数
【发布时间】:2014-10-23 03:33:43
【问题描述】:

我是使用 Angular js 的新手,我已经声明了许多控制器,现在我想将一个控制器的用户功能应用到另一个控制器中。这是我的示例代码。

app.controller('Controller1',function($scope,$http,$compile){
    $scope.test1=function($scope)
    {
          alert("test1");
    }
});

app.controller('Controller2',function($scope,$http,$compile){
    $scope.test2=function($scope)
    {
          alert("test1");
    }
});
app.controller('Controller3',function($scope,$http,$compile){
  ///
});

现在我想在 controller3 中调用 test2 函数。 任何人都可以帮助.. 感谢 Avance... :)

【问题讨论】:

    标签: javascript jquery angularjs


    【解决方案1】:

    控制器是一个构造函数,如果在指令中使用,它将创建一个新实例。

    假设你的控制器在同一个范围内,你仍然可以做你想做的事,只要这样做:

    注意它们必须在相同的范围,如果子范围没有被隔离,它们仍然可以工作。 指令的定义:

    {
        controller: Controller1,
        controllerAs: 'ctrl1',
        link: function($scope) {
    
            $scope.ctrl1.test1(); // call a method from controller 1
            $scope.ctrl2.test2(); // created by the directive after this definition
            $scope.ctrl3.test3(); // created by the directive after this definition
        }
    }
    
    ....
    {
        controller: Controller2,
        controllerAs: 'ctrl2',
        link: function($scope) {
            $scope.ctrl1.test1(); // created earlier
            $scope.ctrl2.test2(); // ...
            $scope.ctrl3.test3(); // created by the directive after this definition
        }
    }
    
    ....
    {
        controller: Controller3,
        controllerAs: 'ctrl3',
        link: function($scope) {
            $scope.ctrl1.test1();
            $scope.ctrl2.test2();
            $scope.ctrl3.test3();
        }
    }
    

    这应该可行。

    【讨论】:

      【解决方案2】:

      最好的方法是编写一个服务并在两个控制器中使用该服务。参见文档Service documentation

      如果您真的想从另一个控制器访问控制器方法,请遵循以下选项: 在范围内发出事件:

      function FirstController($scope) {  $scope.$on('someEvent', function(event, args) {});}
      
      function SecondController($scope) {  $scope.$emit('someEvent', args);}
      

      【讨论】:

      • 是的,但是我已经用很多控制器编写了代码,所以现在我必须调用另一个控制器中的一个函数。
      • 没关系。只需要将该通用功能移至服务并从所需的控制器调用它。
      【解决方案3】:

      您不能从控制器中的控制器调用方法。您需要提取方法,创建服务并调用它。这也将使代码彼此分离并使其更具可测试性

      (function() {
          angular.module('app', [])
              .service('svc', function() {
                  var svc = {};
      
                  svc.method = function() {
                      alert(1);
                  }
      
                  return svc;
              })
              .controller('ctrl', [
                  '$scope', 'svc', function($scope, svc) {
                      svc.method();
                  }
              ]);
      })();
      

      示例:http://plnkr.co/edit/FQnthYpxgxAiIJYa69hu?p=preview

      【讨论】:

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