如何在角度javascript中从另一个控制器调用一个控制器方法?

时间:2016-08-13 05:36:35

标签: javascript angularjs

当我尝试从角度javascript中的另一个控制器调用一个控制器方法时,会发生错误。我觉得那里缺少一些东西。如果有人有完整的方法,请给我答案。

2 个答案:

答案 0 :(得分:1)

能够通过不同的控制器共享变量,这是角度中的常见问题。

您的功能可以被视为对象:您需要通过范围分享它的参考。

要执行此操作,您可以:

使用服务

您可以在控制器中看到注入的单件对象服务:通过控制器共享的公共对象。

您可以使用this精彩指南了解如何使用服务共享范围变量(本指南使用工厂而非服务,但您的需求可以正常使用)。
如果您仍想使用服务,请按this answer。

使用范围层次结构

有时控制器之间有层次结构(因此,范围)。 我们假设你有一种HTML格式:

<div ng-controller="parentController">
   <!-- some content here...-->
   <div ng-controller="childController">
      <!-- some content here...-->
   </div>
</div>

这个结构将产生两个不同的范围:一个用于parentController,另一个用于childController。 因此,您的childController范围将能够通过简单地使用$ parent对象来访问parentController范围。例如:

myApp.controller('parentController', function($scope) {
    $scope.functionExample = function(){
      console.log('hey there');
    };
})

myApp.controller('childController', function($scope) {
    $scope.functionExample();
});

注意:父对象可以直接在子范围中访问,即使在父级中声明也是如此。

提防这种方法:你不能真正确定范围层次结构,因此应该始终检查是否定义了变量。

使用$ rootScope

您可以使用rootscope作为共享对象来共享您的。但要注意:这样,当$ rootScope用于其他用途时,您将冒着污染您的$ rootScope变量的风险(参见消息广播)。

无论如何,请参阅this答案以获取示例用例。

使用消息

通过使用消息,您可以共享对象引用,如下例所示:

myApp.controller('parentController', function($scope, $rootScope) {
     var object = { test: 'test'}
     $rootScope.$broadcast('message', message)
     console.log('broadcasting');
});


myApp.controller('childController', function($scope, $rootScope) {            
     $scope.$on('message', function(message){
        console.log(message);
     });
}); 

最后,我建议您为所有变量使用公共服务,或者尽可能使用范围层次结构方法。

答案 1 :(得分:0)

如果两个控制器嵌套在一个控制器中, 那么你可以通过使用:

简单地调用另一个
devices['device_ip'][<index>]

Angular将从当前范围开始搜索$scope.parentMethod(); 函数,直到达到parentMethod()