扩展角度控制器

时间:2014-10-21 07:03:33

标签: angularjs angularjs-controller

在我工作的当前项目中,我有一个控制器来处理在网格上进行的操作。像删除编辑添加新行初始化验证等。开头的每件事情都很好,但随着操作的增加,文件变成了很长的文件而且很难找到东西和工作。我将在下面添加一个示例代码来描述我的问题。

我的问题:有没有办法将控制器扩展到多个文件?或者有更好的方法来解决我的问题吗?

app.js

var myApp = angular.module('myApp', ['mainControllers']);

gridCntrl

mainControllers.controller('mainController', ['$scope', function ( $scope) {
  $scope.init = function () {
    alert('I am initialized');
       };
  $scope.click = function () {
    alert('I am clicked');
       };

}]);

更清楚的是有一种方法可以将$ scope.init和$ scope.click分开在同一个控制器下,但是在单独的文件中?感谢

1 个答案:

答案 0 :(得分:2)

正如评论中所建议的,您应该评估控制器如此之大的原因。

控制器应该只在ViewModel和Model之间定义ViewModel和marshal数据。

如果您有业务逻辑,请将其移至服务。

否则,如果您有独立的功能区域,请将其分解为多个控制器。不要害怕创建控制器。

假设您有一个带有控制面板的应用程序,它定义了一些配置,主视图和其他部分(如UserProfile)。尽管它们可能总是在UI中并排显示(实际上,通过相同的View),但控制面板UI逻辑(当用户与其交互时显示/启用/添加的内容)应该封装在controlPanelController中,一个或多个其他控制器中的主要应用程序交互。

所以,你可以这样做:

<div ng-controller="mainCtrl">
   <div ng-controller="controlPanelCtrl" ng-include="'partial/controlpanel'"></div>
   <div ng-controller="mainViewCtrl" ng-include="'partial/mainview'"></div>
   <div ng-if="isUserLoggedIn()" ng-controller="profileInfoCtrl ng-include="'partials/profile'"></div>
</div>

.controller("mainCtrl", function($scope, ConfigSvc, UserService){
  $scope.config = ConfigSvc;
  $scope.isUserLoggedIn = UserService.isLoggedIn;
})

.controller("controlPanelCtrl", function($scope, ConfigSvc){
  $scope.config = ConfigSvc;
  $scope.changeColor = function(color){ ConfigSvc.color = color; };
})

.controller("mainViewCtrl", function($scope, ConfigSvc){
  $scope.color = ConfigSvc.color;
})

更广泛的一点是,将控制器分成多个控制器,而不是一个在多个文件中定义的控制器。