簡體   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