目前我有一个有侧边栏的应用程序,侧边栏使用以下方式加载不同的html模板ng-include
基于用户选择执行的操作。这是一个与地图相关的应用程序,例如,如果用户选择“添加航段”按钮,它将加载add_leg.html
使用模板将其放入侧边栏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
in js/controllers.js
)并且它开始变得非常混乱。我现在有很多方法,因为应用程序的功能正在扩展。我想将我的控制器分成多个控制器,同时保留此侧边栏功能。
我希望有MainCtrl
作为控制侧边栏模板加载的主控制器(通过更改sidebar_template
指向文件目的地的变量),我希望它控制一些与全局地图相关的方法(例如从坐标中获取郊区名称等)。
我尝试像这样分割它:
controllers/js/main.js - MainCtrl
controllers/js/legs.js - LegCtrl
controllers/js/routes.js - RouteCtrl
我想要LegCtrl
and RouteCtrl
来继承MainCtrl
所以我可以访问它的范围和方法,这很好。但现在的问题是如何根据需要的功能将控制器动态加载到侧边栏 div 上。本来我所有的方法都在MainCtrl
,它位于侧边栏 div 周围的包装器 div 上(再次参见上面的示例),所以这不是问题。
例如,假设我按下“添加航段”按钮,则需要调用addLeg
in LegCtrl
, but LegCtrl
未加载到应用程序上,因此它无权访问该方法。我可以保留addLeg()
在 - 的里面MainCtrl
,并让它改变sidebar_template
变量来加载模板,但模板中的任何内容都不起作用,因为它是从内部调用方法LegCtrl
now.
我需要以某种方式动态加载侧边栏上的控制器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
上班)。我还需要某种方式来打电话addLeg
on the LegCtrl
来自MainCtrl.addLeg
(也许使用广播?)。
如果有人能指出我正确的方向,那就太好了。抱歉,这篇文章很长,需要一些解释才能使其连贯。希望这是有道理的。谢谢。
Update:我想我已经找到了一个使用服务充当导航控件的解决方案(它将加载相关模板并向动态加载的新控制器广播一个事件,以告诉它要执行什么函数):
http://plnkr.co/edit/Tjyn1OiVvToNntPBoH58?p=preview http://plnkr.co/edit/Tjyn1OiVvToNntPBoH58?p=preview
现在只是想测试一下这个想法,但是广播.on
不起作用。我认为这是因为广播在模板加载之前触发。我怎样才能解决这个问题?对于我正在做的事情来说,这是一个好的解决方案吗?