目前我有一個具有側邊欄的應用程序,側邊欄根據用戶選擇的操作使用ng-include
加載不同的html模板。這是一個與地圖相關的應用程序,因此,例如,如果用戶選擇「添加腿」按鈕,它會在add_leg.html
模板加載到使用ng-include
側邊欄:動態加載控制器和ng-include
// The Javascript code:
$scope.addLeg = function() {
$scope.sidebar = true;
$scope.sidebar_template = '/partials/legs/add_leg.html';
}
// Simplified example of HTML:
<html>
<div ng-app="MyApp" ng-controller="MainCtrl">
<a ng-click="addLeg()">Add Leg</a>
<a ng-click="addRoute()">Add Route</a>
<a ng-click="editLeg()">Edit Leg</a>
<a ng-click="editRoute()">Edit Route</a>
...
<div id="sidebar" ng-class="{'sidebar-hidden': sidebar == false}">
<div ng-include src="sidebar_template"></div>
</div>
<google-map></google-map>
</div>
這是一切都很好,並根據需要工作,但目前我的應用程序只使用一個控制器(MainCtrl
在js/controllers.js
),它開始變得非常混亂。現在我有很多方法,因爲應用程序功能正在擴展。我想將我的控制器分成多個控制器,同時保留此側邊欄功能。
我想有MainCtrl
作爲控制欄模板的加載(通過改變sidebar_template
變量指向的文件目的地)主控制器,我想它來控制一些全球地圖相關的方法(如從座標獲取郊區名稱等)。
我試着像這樣分割:
controllers/js/main.js - MainCtrl
controllers/js/legs.js - LegCtrl
controllers/js/routes.js - RouteCtrl
我想LegCtrl
和RouteCtrl
繼承MainCtrl
所以我可以訪問它的範圍和方法,這是所有罰款。但現在的問題是,如何根據需要哪些功能將控制器動態加載到側欄div上。最初,我所有的方法都在MainCtrl
中,並且位於邊欄div周圍的包裝div(請參閱上面的示例),所以這不是問題。
例如,假設我按「添加腿」按鈕,這將需要調用addLeg
在LegCtrl
,但LegCtrl
沒有加載上的應用程序,因此它不能訪問的方法。我可以將addLeg()
保存在MainCtrl
之內,並將其更改爲sidebar_template
變量以加載該模板,但模板中的任何內容都不起作用,因爲它現在正在調用LegCtrl
之內的方法。
我需要也許莫名其妙動態加載側邊欄上的ng-include
DIV控制器,是這樣的:
// MainCtrl
$scope.addLeg = function() {
$scope.required_controller = LegCtrl;
$scope.sidebar = true;
$scope.sidebar_template = '/partials/legs/add_leg.html';
LegCtrl.addLeg();
}
<div id="sidebar" ng-class="{'sidebar-hidden': sidebar == false}">
<div ng-include src="sidebar_template" ng-controller="{{required_controller}}"></div>
</div>
在非工作上面的例子,你可以看到一個可能的解決方案我想過的,但我需要LegCtrl
作爲實際的控制器功能,而不是一個對象(ng-controller
工作)。我還需要一些方法從MainCtrl.addLeg
(可能使用廣播?)撥打LegCtrl
上的addLeg
。
如果任何人都可以指出我的方向會很棒。對於這篇巨大的文章感到抱歉,它需要一些解釋才能使其一致。希望它是有道理的。謝謝。
更新:我想我已經找到了一個使用服務作爲導航控件的解決方案(它將加載相關模板並向正在動態加載的新控制器廣播一個事件,以告訴它要執行的功能):
http://plnkr.co/edit/Tjyn1OiVvToNntPBoH58?p=preview
只是想出來,現在來測試這個想法,但廣播.on
不起作用。我認爲這是因爲廣播在模板加載之前觸發。我怎樣才能解決這個問題?這是我正在做的一個很好的解決方案嗎?
我看到你的潛水員並編輯它以包含控制檯消息。它會告訴你事件首先發布,然後監聽器開始收聽。發生這種情況是因爲每個事物都是在角應用程序中加載的。 http://plnkr.co/edit/rWZ3x2Jzk9EV3OpD1HF1?p=preview –