目前我有一个具有侧边栏的应用程序,侧边栏根据用户选择的操作使用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 –