2014-07-14 91 views
2

我想通過其控制器公開一些我的指令的功能(爲此指令考慮一個公共API)。將指令控制器暴露給父控制器

return { 
     restrict: 'E', 
     scope: {}, 
     controller: function($scope) { 
      this.method1 = ...; 
      this.method2 = ...; 
     }, 
     controllerAs: 'dir', 
     link: function (scope, element, attrs) { ... } 
    } 

然後在我父控制器或模板調用dir.method1得到的東西指令內完成。任何想法,如果這是可能的Angular 1.3?

我想避免事件傳遞甚至函數傳遞,我聽說這是可能的,雖然我從來沒有見過這種實現。

+2

把功能於一身的服務,並通過注入其共享服務在你需要它的應用 – charlietfl

+0

你怎麼會在這種情況下初始化服務有,我要公開的功能呢?換句話說,我怎麼能在服務內部鏈接'method1'。 –

+0

把對象/數組或其他任何你想要在服務中進行製作,並創建getter和setter方法來修改它 – charlietfl

回答

1

這是可能的,但你的問題是不知道如何獲得API。這是如何從父母那裏得到它。您正在通過使用「範圍」選項創建isolate scope。你也使元素類型的指令,所以我猜你在做這樣的事情:

<my-parent> 
    <my-child></my-child> 
</my-parent> 

其中<my-parent>是父的指令,並<my-child>是要公開的API指令。

真正的問題是你想要在這裏實現的。完全有辦法做你在問什麼。僅僅因爲範圍是孤立的並不意味着你無法實現。您可以遍歷父級$ scope的$$ childHead/etc列表來查找想要訪問其API的子級。您在孩子中定義的任何內容如下:

$scope.myApiFunction = function() { 
}; 

將在此處可見。 (事情,你把「這個」不會 - 使用$範圍存儲桶代替。)

這意味着,如果你只有一個孩子,你可以做這樣的事情從父控制器:

$scope.$$childHead.myApiFunction(); 

簡單。另外,非常粗糙。這裏有很多問題:如果你有很多孩子會怎麼樣?如果這個孩子的API結束了一級,該怎麼辦?等等。它打破了各種面向對象的模式,而且它會變得混亂,快速。

你的問題非常抽象 - 如果你用一個確切的例子更新它可能會很好。沒有這個,讓我猜你的目標。有兩種方法可以在Angular內鼓勵「像這樣」:

  1. 服務。每當你說「API」時,首先想想服務。服務是一個單獨的(自動),因此它是爲創建API而量身定做的。而且服務可以使用Factory模式返回一個類型的對象,所以這些是爲了做一些事情而設計的,比如有一個管理服務處理,比如在IM客戶端中的好友列表,使用創建,刪除和查找好友的API方法。

  2. 在定義時向其父母添加「可選」功能的項目。比方說,我們有三種可能的工具提示類型:具有懸停效果的工具提示,具有點擊效果的工具提示以及按某種順序由「漫遊」系統觸發的工具提示。對於這種事情,在容易的事剛好相反的API,像這樣:

父控制器:

$scope.tooltipHandler = { 
    showTooltip: function() {}, 
    hideTooltip: function() {} 
}; 

兒童控制器:

$scope.$parent.tooltipHandler = { 
    showTooltip: function() { 
     // Do some real work 
    }, 
    hideTooltip: function() { 
     // Do some real work 
    }, 
} 

什麼在這裏發生是否定義了任何工具提示,當父級運行時,沒有任何反應。如果添加藍色工具提示顯示模塊,則當父級現在運行其演練時,它將顯示藍色工具提示。

有意義嗎?

+0

實際上,如果我在父指令中包裝了我的子指令,我會使用'require'選項並完成它。這個指令的父親是一個普通的舊控制器。 –

+0

幾乎沒有什麼區別。指令只是一個便利的包裝器,可以很容易地將模板,控制器和支持組件組合在一起。在*指令內運行*的控制器與在*之外運行*的控制器相同。無論你是用'

'還是'來製作它並在裏面定義它都沒關係。上述技術在兩種情況下都以完全相同的方式工作。這裏重要的是*範圍* ......它也以完全相同的方式工作。 :) –

1

我到了這裏尋找類似的迴應。到目前爲止,我能想到的最好方法就是去做Angular與ngForm做的事情。

documentation明確指出

如果指定的名稱屬性,則形式控制器被髮布到下此名稱電流範圍。

這基本上使表單控制器可以從任何地方訪問。

如果您有以下DOM

<div ng-controller="MyCtrl as parentCtrl"> 
    <form name="parentCtrl.frmCtrl"> 
    <my-child-directive> 
    </form> 
</div> 

您可以使用require: 'ngForm'my-child-directive擺脫內部指令訪問。如果您在父控制器中,則可以通過frmCtrl變量訪問它。

不知道這是否是最佳做法。在ngForm中,01​​屬性效果很好,但我甚至不知道如何爲自定義指令調用這樣的屬性。

這就是爲什麼我來到這裏,我想知道這是否是「角辦法」,什麼類型的convetions的是關於這個問題的。

希望它有幫助!

相關問題