如何在角度控制器中通过引用传递函数

时间:2016-03-09 12:01:37

标签: javascript angularjs

我正在构建一个角度应用程序,我按顺序有两个控制器 父控制器 - >子控制器,只有在父控制器完全执行时才调用子控制器。

我正在使用范围内的对象将属性从Parent传递给Child控制器,该控制器工作正常。

但是,现在我想以相同的顺序传递一个函数,但是我无法从子控制器访问它。

parentController.js

function ParentController($scope) {
  ...
  function _loadCarrierObject() {
    $scope.carrierObject = {};
    $scope.carrierObject.foo = bar;
    ...
    $scope.carrierObject.getUpdates = _fetchUpdates;
}

function _fetchUpdates() {
  ...
}

childController.js

function getUpdates() {
  $scope.carrierObject.foo;            // returns bar
  $scope.carrierObject.getUpdates();   // returns undefined
}
编辑:我应该是明确的。我正在尝试将function关键字与两个函数定义一起使用。

5 个答案:

答案 0 :(得分:2)

您可以使用$ rootScope。$ emit和您的父控制器监听的事件,这可以完成您的功能吗?

示例:

app.controller('ParentCtrl', function ParentCtrl ($scope) {
 $scope.$on('child', function (event, data) {
   console.log('foo');
 });
});

app.controller('ChildCtrl', function ChildCtrl ($scope) {
 $scope.$emit('child', 'bar');
});

答案 1 :(得分:0)

您错过了function关键字

function _fetchUpdates() {
  ...
}

答案 2 :(得分:0)

fetchUpdates()实际上是返回undefined还是它给你一个'undefined is not a function'错误?

如果是前者,这可能是_fetchUpdates()的问题,而不是你传递它的方式。也许这是一个异步问题?你能分享那个功能的身体吗?

@Emjay有更正确的答案。在控制器之间建立这种紧密依赖性被认为是一种不好的做法。最好在$ rootScope上使用消息传递。

答案 3 :(得分:0)

可以通过调用其名称在另一个函数中调用函数,但不能将其分配给另一个函数中的引用。 创建对函数的引用,然后将其传递给子控制器。像下面的东西应该工作

function ParentController($scope) {
  ...
  $scope.fetchUpdates = _fetchUpdates;

  function _loadCarrierObject() {
    $scope.carrierObject = {};
    $scope.carrierObject.foo = bar;
    ...
    $scope.carrierObject.getUpdates = $scope.fetchUpdates;
  }

  function _fetchUpdates() {
  ...
  }

} 
顺便说一下,代码看起来不完整,所以我只是在必要时添加了大括号。

有关详细信息,请参阅此plunkr。点击Chrome上的F12,在控制台中查看plunkr的输出。

答案 4 :(得分:0)

从您向我们展示的代码中,它应该将函数引用放在范围内的对象中。

我不同意这是好的风格。然而,并没有真正的东西"父母"和孩子"控制器。如果要在两个控制器之间进行通信,理想的方法是创建共享服务。如果您真的有父/子关系,例如"显示用户"指令内部有一个"更新用户按钮"指令,你应该使用明确声明与require的关系的指令。

如果组件除了共享数据之外并不是真正相关的,那么您可以使用两个指令将模板中的同一个对象传递给它们。