【发布时间】:2016-02-19 17:31:34
【问题描述】:
我有相当复杂的控制器(大约 3K 行代码)来演示仪表板。控制器包含很多图表、网格表等。
例如,我将网格表逻辑移动到下面提到的名为 wmGridActionItems 的指令中。注意,它使用父作用域:
app.directive('wmGridActionItems', ['$rootScope', '$timeout', function ($rootScope, $timeout) {
return {
restrict: 'E',
templateUrl: 'views/grid-action-items.html',
link: function (scope, elem, attrs) {
// logic goes here
}
};
}]);
和 HTML:
<div ui-grid="gridActionItemsOptions"
ui-grid-auto-resize
ui-grid-pagination
ui-grid-selection
ui-grid-auto-resize
ui-grid-resize-columns>
</div>
所以在 main 控制器 HTML 中我只写:<wm-grid-action-items></wm-grid-action-items>
我没有设法在其他地方使用这个指令,但至少我将我的 BIG 控制器划分为几个小指令,这些指令应该可以帮助我处理仪表板。
我做错了什么?这是好习惯吗? Angular 有其他方法可以解决这个问题吗?
编辑
这是我的$StateProvider 仪表板视图:
$stateProvider
.state('sidemenu.dash', {
url: '/dshmngr',
abstract: true,
views: {
'content': {
templateUrl: 'views/dashboard/dashboard_manager.html',
controller: 'DashboardMngrCtrl'
}
}
})
.state('sidemenu.dash.main', {
url: '/main',
views: {
'content': {
templateUrl: 'views/dashboard/dashboard-main.html',
controller: 'DashboardNewCtrl'
}
}
})
.state('sidemenu.dash.drill', {
url: '/drill/:type',
views: {
'content': {
templateUrl: 'views/dashboard/dashboard-tag-details.html',
controller: 'DashboardDetailedCtrl'
}
}
})
谢谢,
【问题讨论】:
-
与其将主控制器的逻辑放在指令中,不如制作另一个控制器并将逻辑放在那儿?没有什么能阻止您拥有多个控制器。
-
好吧,我尝试解决当前的问题。通常我有 3 个带有抽象路由和几个子视图的控制器。每个视图都有自己的控制器。但是将一个视图拆分为多个控制器会导致逻辑过于复杂,广播、观察者等等
-
作为一个好习惯,你不想在控制器中做太多的逻辑。这不仅适用于角度,而且适用于孔 MVC 框架。所以你会想要打破工厂或服务中指令的逻辑。正如@jperov 所说,您可以拥有多个控制器,甚至可以从一个控制器继承到另一个控制器
-
@snaggs 只是看到您的评论,您可以考虑继承子视图中的控制器。你可以在这里阅读更多:stackoverflow.com/questions/15386137/…
标签: angularjs angularjs-directive