Подтвердить что ты не робот

Хорошо ли иметь главный контроллер в 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);
      }
    }; 
  }]);
4b9b3361

Ответ 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');