2017-04-21 64 views
0

我有一個控制器名稱作爲字符串,我想要它的構造函數。通過角度控制器名稱訪問控制器構造函數

我目前的方法如下使用$控制器:後來

$scope.myControllerConstructor= $controller("myControllerName" , {$scope: $scope.$new()}).constructor; 

,我用這種構造在這樣的HTML:

<div ng-controller="myControllerConstructor"> 

的問題是我的控制器運行兩個時間,有一次,當我得到的構造函數(這是錯誤的)和一次當我的HTML被編譯(這是正確的)

問題是如何獲得控制器構造函數,而不運行我T'


更新大約用例:在我們的應用中有60間%的相似性和40%不同的活動很多頁。我爲這些頁面創建了一個指令,團隊中的其他開發人員正在使用我的指令創建頁面。

該指令接受一個模板和一個控制器(我讓他們爲字符串),後來包括我所提供的模板和控制器如下:

<div ng-include="myTemplate" ng-controller="myControllerConstructor"></div> 

請看一看this jsfiddle爲一個簡單的例子問題。

+0

方法沒有多大意義。你試圖解決什麼更高水平的問題? – charlietfl

+0

如果您使用它來進行控制器繼承,我會建議更新標題和問題以符合您的情況,這樣可以更清楚並更容易地找到它。 – estus

+0

延遲安裝API是私有的,並且不打算被應用程序使用。濫用AngularJS框架有很多方法。以非結構化的方式使用它通常會導致一個脆弱的應用程序,這是一個維護噩夢。那麼你的用例是什麼?也許有更好的結構化方式來實現它。 – georgeawg

回答

1

你的代碼的結構看起來不錯,但問題是$controller("myControllerName" , {$scope: $scope.$new()})已經實例化給你的給定範圍的控制器。

確實,您可以通過.constructor訪問控制器構造函數,但已經創建控制器的實例太晚了。

ng-controller做同樣的事情作爲$controller("myControllerName" , {$scope: $scope.$new()})

當控制器連接到經由NG-控制器 指令的DOM,AngularJS將實例化新的控制器對象,使用 指定控制器的構造函數。將創建一個新的子範圍 ,並將其作爲$ scope的 控制器構造函數的注入參數。

爲了解決這個問題,你應該通過控制器構造函數pageDirectiveTemplate代替控制器名稱。

working fiddle

+0

謝謝,它解決了這個問題。 – Arashsoft

0

有一種不同的方式可以實現這一點。在指令中,在使用獨立作用域時(如你在小提琴上做的那樣),你可以擁有一個屬性controller,它的值爲"@",另一個name屬性的值爲"myController"或任何你的控制器名稱。

所以,你的指令可能是這個樣子:

app.directive('pageDirective', function() { 
    return { 
    restrict: "A", 
    templateUrl: "pageDirectiveTemplate", 
    scope: { 
     myTemplate: "@" 
    }, 
    controller: "@", 
    name: "myController" 
    } 
}); 

注意,只有在HTML改變將有指令爲屬性而不是元素。所以,

<div page-directive my-template="templateA" my-controller="controllerA"> 
</div> 
<div page-directive my-template="templateA" my-controller="controllerB"> 
</div> 

這會給你正是你在找什麼。現在你可以有相同的模板指向不同的控制器,反之亦然。

working fiddle |請注意,它適用於具有相同模板的兩個不同控制器。另外,請檢查控制檯,看它是如何從每個控制器只記錄一次。

+0

這很好,但問題是我們與「pageDirectiveTemplate」和「templateA」共享控制器。 pageDirectiveTemplate控制器是靜態的並且具有共享邏輯。但是,myController是動態的。 – Arashsoft

+0

@Arashsoft,哦射擊。所以讓我清楚..你想分享一個動態控制器(說'controllerA')與一個靜態('pageDirectiveTemplate')爲一些動態模板。對? – tanmay

+0

「pageDirective」有自己的控制器和模板(它們是靜態的)。在「pageDirectiveTemplate」裏面,我想用動態控制器注入一個動態模板。目前我使用'

',它工作正常,但控制器運行兩次。 – Arashsoft