2014-10-21 6 views
0

В текущем проекте, в котором я работаю, у меня есть контроллер, который занимается операциями, выполняемыми на сетке. Как удалить Редактировать добавить новую строку инициализировать проверку и так далее. В начале все было хорошо, но по мере того, как операции увеличивали файл, он превращался в очень длинный файл, и ему казалось, что трудно найти материал и работать. Я добавлю следующий пример кода, который будет описывать мой вопрос.Расширить угловой контроллер

Мой вопрос: есть ли способ расширить контроллер на несколько файлов? Или есть лучший способ решить мою проблему?

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

Похоже, у вас много логики в контроллере. Вместо этого попробуйте перейти к услугам. – cbass

+0

Правильно, но можно ли добавить область контроллера сетки в определение услуги? Я знаю, что я могу получить к нему доступ, покупая его из элемента, но можем ли мы добавить его в определение как параметр? – SamSamet

+0

Да, вы можете создать отдельный файл (common_utils.js) и вызвать его в index.html. там вы можете создать метод с параметром scope (для перемещения общей функциональности). этот метод можно вызвать из вашего контроллера. – Asik

ответ

2

Как указано в комментариях, вы должны оценить, почему ваш контроллер настолько велик.

Контроллеры должны просто определять данные ViewModel и маршала между ViewModel и Model.

Если у вас есть бизнес-логика, переместите ее на службу.

В противном случае, если у вас есть независимые области функциональности, разделите его на несколько контроллеров. Не бойтесь создавать контроллеры.

Скажем, у вас есть приложение с панелью управления, которая определяет некоторую конфигурацию, основной вид и другие части (например, UserProfile). Хотя они всегда могут отображаться бок о бок в пользовательском интерфейсе (и, фактически, одним и тем же представлением), логика пользовательского интерфейса панели управления (то, что отображается/включено/добавлено, когда пользователь взаимодействует с ней) должно быть инкапсулировано в 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; 
}) 

Чем шире точка, разбить контроллер на несколько контроллеров, а не один контроллер, который определен в нескольких файлах.

+0

Спасибо, что это идеальное руководство для меня, чтобы следовать. Я внесу изменения в соответствии с вашими предложениями. – SamSamet

Смежные вопросы