-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

+0

您能否解釋一下你想達到什麼目的?爲什麼你重新編譯'element',爲什麼你重新編譯(不存在的,在你的例子中)transcluded內容? – 2015-03-31 00:17:05

+0

apiDirective生成模態,它是一個包裹角引導模式的抽象層,它接受模板,控制器和回調); consumerDirective生成一種特定類型的模式(在我們的例子中是一個選擇器)。這個想法是,你可以有任意的子dom,它導致了consumerFunction的運行,並用當前作用域的數據觸發選擇器的創建。我無法真正粘貼任何特定的代碼,因爲它是專有的,但我很樂意回答您的任何進一步問題。 – 2015-03-31 00:39:16

+0

你可以發佈一些合理的(如果不是確切的)代碼嗎?我不明白會發生什麼,什麼不發生。而且,你還沒有通過重新編譯來回答你想要達到的目標......而且,它似乎「破碎」(即使這是從外部調用由指令定義的函數的意圖 - 我指的是' NG-點擊= 「consumerFunction()」' – 2015-03-31 00:44:18

回答

0

你需要有你正在尋找,如果你想找到的東西的控制指令的情況下(只需要返回,而不是功能的工廠控制器的情況下)。工作示例:http://plnkr.co/edit/XP3dV456M0No6nbx2zOW?p=preview

<body> 
    <div ng-app="test"> 
     <consumer-directive api-directive ng-click="consumerFunction()">aaa</consumer-directive> 
    </div> 

相關問題