-1
比方說,我有以下兩條指令:transclusion似乎下降控制器
angular.module('test').directive('apiDirective', function(){
return {
restrict: 'A',
controller: function() {
this.awesomeFunction = function() {
console.log("CHECK ME OUT BEING AWESOME");
}
}
}
});
angular.module('test').directive('consumerDirective', function ($compile) {
return {
restrict: 'E',
require: '?apiDirective',
transclude: true,
link: function (scope, element, attrs, controller, transcludeFn) {
console.log('preLink controller: ', controller);
transcludeFn(scope, function (tElem, tScope) {
if (attrs.apiDirective === undefined) {
element.attr('api-directive', '');
$compile(element)(scope);
}
element.html(tElem);
$compile(tElem)(tScope);
});
scope.consumerFunction = function() {
console.log('trying to consume the awesome', controller);
controller.awesomeFunction();
}
}
}
});
而且下面的HTML:
<consumer-directive ng-click="consumerFunction()"/>
當指示載荷transclusion發生如預期,設置控制器是我的api指令控制器。然而在consumer功能中,控制器始終是null
。爲什麼?我懷疑這與第二次編譯有關係嗎?
完全刪除第二個編譯會導致該指令無法呈現。爲什麼?
這是怎麼回事,我該如何解決它,而無需手動在指令上內聯屬性級別控制器?
plnkr演示:http://plnkr.co/edit/Lbh7T9FRg3nS6ERW4HtA
您能否解釋一下你想達到什麼目的?爲什麼你重新編譯'element',爲什麼你重新編譯(不存在的,在你的例子中)transcluded內容? – 2015-03-31 00:17:05
apiDirective生成模態,它是一個包裹角引導模式的抽象層,它接受模板,控制器和回調); consumerDirective生成一種特定類型的模式(在我們的例子中是一個選擇器)。這個想法是,你可以有任意的子dom,它導致了consumerFunction的運行,並用當前作用域的數據觸發選擇器的創建。我無法真正粘貼任何特定的代碼,因爲它是專有的,但我很樂意回答您的任何進一步問題。 – 2015-03-31 00:39:16
你可以發佈一些合理的(如果不是確切的)代碼嗎?我不明白會發生什麼,什麼不發生。而且,你還沒有通過重新編譯來回答你想要達到的目標......而且,它似乎「破碎」(即使這是從外部調用由指令定義的函數的意圖 - 我指的是' NG-點擊= 「consumerFunction()」' – 2015-03-31 00:44:18