繁体   English   中英

如何在角度控制器中通过引用传递功能

[英]How to pass a function by reference in angular controllers

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

我在作用域上使用一个对象,以将属性从父级传递到运行良好的子级控制器。

但是,现在我想以相同的顺序传递函数,但是我无法从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关键字。

您可以只$ 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');
});

您只是缺少function关键字

function _fetchUpdates() {
  ...
}

fetchUpdates()实际上返回未定义还是给您“未定义不是函数”错误?

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

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

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

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

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

  function _fetchUpdates() {
  ...
  }

} 

顺便说一句,代码看起来不完整,因此我仅在必要时添加了右花括号。

有关更多信息,请参见此插件 在Chrome上按F12键,以在控制台中查看plunkr的输出。

根据您向我们展示的代码,应该可以将函数引用放在作用域上的对象中。

我不会同意那是好的风格。 但是,实际上并没有所谓的“父”和“子”控制器。 如果要在两个控制器之间进行通信,理想的方法是创建共享服务。 如果您确实具有父/子关系,例如“显示用户”指令内部有一个“更新用户按钮”指令,则应使用以require显式声明该关系的指令。

如果这些组件除了共享数据外并没有真正的关系,则可以使用两个指令,在该指令中将同一对象传递给模板中的两个对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM