Хорошо ли иметь главный контроллер в Angular?
Я не знаю, является ли это хорошей практикой... У меня есть контроллер, определенный в конфигурации маршрутов, но поскольку мой HomeCtrl
находится в ng-if
, он не может слушать loginSuccess
, поэтому я сделал MainCtrl
, который слушает для loginSuccess
и реагирует соответствующим образом. Этот код работает отлично, но это пахнет, как взломать меня. Должен ли я удалить MainCtrl
и сделать его услугой? Если так, то какой-то пример будет действительно замечательным.
Index.html
<body ng-app="myApp" ng-controller="MainCtrl">
<div ng-if="!isLoged()">
<signIn></signIn>
</div>
<div ng-if="isLoged()">
<div class="header">
<div class="nav">
<ul>
<a href="/"><li class="book">navItem</li></a>
</ul>
</div>
</div>
<div class="container" ng-view=""></div>
</div>
</body>
App.js
angular.module('myApp', [])
.config(function ($routeProvider) {
$routeProvider
.when('/', {
templateUrl: 'views/main.html',
controller: 'HomeCtrl'
})
.otherwise({
redirectTo: '/'
});
})
.controller('MainCtrl', function ($scope) {
$scope.user = false;
$scope.isLoged = function(){
if($scope.user){
return true;
}else{
return false;
}
}
$scope.$on('event:loginSuccess', function(ev, user) {
$scope.user = user;
$scope.$apply();
});
})
.controller('HomeCtrl', function ($scope, $location) {
//this is home controller
})
.directive('signIn', function () {
return {
restrict: 'E',
link: function (scope, element, attrs) {
//go to the server and then call signinCallback();
}
};
})
.run(['$window','$rootScope','$log',function($window, $rootScope){
$window.signinCallback = function (res) {
if(res){
$rootScope.$broadcast('event:loginSuccess', res);
}
else{
$rootScope.$broadcast('loginFailure',res);
}
};
}]);
Ответы
Ответ 1
Я запускаю все мои проекты Angular с помощью:
<html ng-app="appName" ng-controller="appNameCtrl">
Использование "глобального" контроллера может не понадобиться, но всегда приятно иметь его, когда возникает необходимость. Например, я использую его в своей CMS для установки привязки, которая инициирует загрузку всего остального - поэтому из-за нее загружаются все субконтроллеры. Это не нарушает разделение проблем, поскольку глобальный контроллер относится к IS для облегчения загрузки других контроллеров.
Тем не менее, просто убедитесь, что все как модульное/разделенное и многоразовое возможно. Если ваши контроллеры полагаются на существование глобального контроллера, чтобы функционировать, возникает проблема.
Ответ 2
На мой взгляд, angular js 'power поставляется с четким разграничением директив, сервисов, ресурсов и т.д. Идеальные контроллеры связаны с шаблонами или частичными элементами и используются для обновления интерфейса и выполнения вызовов сервисам или ресурсам, Чем скорее вы начнете делать эти разделения, тем скорее вы начнете создавать чистые и масштабируемые приложения, о которых другие разработчики могут быстро понять. Для структуры приложения я настоятельно рекомендую вам изучить любой из этих двух инструментов:
Lineman.js
и
Yeomann
У сайта lineman действительно очень хороший раунд того, как они отличаются друг от друга, если вы прокрутите вниз.
В вашем сценарии есть много способов связать контроллеры или вызвать вызовы функций, которые находятся в разных областях. Вы можете создать службу, которая вводит ваши контроллеры, или вы можете использовать $emit и $on для настройки уведомлений в приложении, например:
В контроллере A
$rootScope.$on('myNotifier:call', function() {
myFunction();
});
И в контроллере B или любом другом контроллере вы можете вызвать myFunction() с помощью:
$scope.$emit('newPatientModal:close');