2013-10-11 76 views
4

我需要得到父母的控制,所以我的指令有一個需要屬性,如下所示:遞歸訪問父指令的控制器AngularJS

module.directive('tag', function() { 
    return { 
     require: '?^tag', 
     restrict: 'E', 
     controller: function() { 
      this.payload = getPayload(); 
     }, 
     link: function (scope, element, attrs, ctrl) { 
      usePayload(ctrl.payload); 
     } 
    }; 
}); 

但是鏈接功能的CTRL參數返回當前指令的控制器,而不是父母的。 AngularJS的文檔很清楚:

?^ - 嘗試通過搜索元素的父項找到所需的控制器,或者如果找不到,則返回null。

我在做什麼錯?

+1

'require:'?^ parent''或將指令的控制器賦值給父控制器的名稱,或者將指令的控制器放在一起,並且鏈接參數中的'ctrl'將默認爲父類型。 –

+0

請看[John Lindquist]的視頻(http://egghead.io/lessons/angularjs-directive-communication),它可以很好地解釋嵌套指令之間的通信。 –

+0

@ m.e.conroy:我必須在'require'中使用相同的名稱。如果沒有聲明控制器,'ctrl'默認爲'undefined'。 –

回答

10

無論是文檔或誤導這裏的代碼... require^着眼於當前元素,然後將所有的父母,用inheritedData方法(見https://github.com/angular/angular.js/blob/master/src/ng/compile.js#L942)。因此,您將無法使用此方法向父母申請具有相同名稱的指令。

當我以前遇到過這個問題時,我已經看過form指令,它需要按照你的要求去做。它的控制器方法抓住像這樣(https://github.com/angular/angular.js/blob/master/src/ng/directive/form.js#L39)母公司:

controller: function($element) { 
    var parentForm = $element.parent().controller('form'); 
} 

考慮這一點,你應該能夠調用element.parent().controller('tag')發現無論是在控制器或postLink方法父控制器。

+1

這個作品,謝謝!我唯一擔心的是'controller()'方法沒有在其API中公開,因此不打算供公衆使用,並且可能會有所改變。 –

+0

Docs可以被隱藏在'angular.element'的文件中:http://docs.angularjs.org/api/angular.element。這是肯定記錄在不穩定的分支,但我沒有檢查穩定。 – Andyrooger

+0

這非常有幫助。謝謝,我想製作一個可以作爲自己的容器的元素,所以,這是完美的。另外,我讀過將元素傳遞給控制器​​不是一個好主意,因此您可以始終使用鏈接函數中的元素 –

相關問題