在Angular中使用主控制器好吗?

时间:2013-12-06 21:05:28

标签: javascript angularjs

我不知道这是不是一个好习惯...我在路由配置中定义了一个控制器,但由于我的HomeCtrlng-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);
      }
    }; 
  }]);

2 个答案:

答案 0 :(得分:10)

我用以下内容启动所有Angular项目:

<html ng-app="appName" ng-controller="appNameCtrl">

使用“全局”控制器可能没有必要,但在需要时随身携带它总是很好的。例如,我在我的CMS中使用它来设置一个绑定,启动其他所有内容的加载 - 因此所有子控制器都被加载。这并不违反关注点的分离,因为全球控制器的关注点是促进其他控制器的加载。

尽管如此,只要确保将事物保持模块化/分离并尽可能重复使用。如果您的控制器依赖于全局控制器的存在以便运行,则存在问题。

答案 1 :(得分:0)

在我看来,角度js&#39;功能来自于清楚地分离出不同的控制器指令,服务,资源等。理想情况下,控制器链接到模板或部分,并用于更新前端并调用服务或资源。越早开始进行这些分离,您就越早开始制作干净且可扩展的应用程序,其他开发人员可以快速理解。对于应用程序结构,我强烈建议您查看这两个工具中的任何一个:

Lineman.js

Yeomann

如果向下滚动,有线电视网站实际上对两者的差异有很好的总结。

在您的场景中,有许多方法可以链接控制器或进行不同范围的函数调用。您可以创建一个注入控制器的服务,也可以使用$ emit和$ on在应用程序中设置通知,例如:

在控制器A中

$rootScope.$on('myNotifier:call', function() {
        myFunction();
    });

在Controller B或任何其他控制器中,您可以使用:

调用myFunction()
$scope.$emit('newPatientModal:close');