AngularJS使用全局变量更改类

时间:2014-01-06 05:50:34

标签: javascript jquery html angularjs global-variables

我刚刚创建了一个angularJS应用程序。

这是我的 index.html

<html ng-app="MyApp">
  <head>
    <!-- CSS files import -->
  </head>
  <body class="{{bodylayout}}">
    <div ng-view></div>
  </body>
  <--! JS imports 
   aungular.js
   app.js
   login.js
   register.js
   -->
</html>

app.js

'use strict';
//Define Routing for app
angular.module('myApp', []).config(['$routeProvider', '$locationProvider',
  function($routeProvider,$locationProvider) {
    $routeProvider
    .when('/login', {
        templateUrl: 'login.html',
        controller: 'LoginController'
    })
    .when('/register', {
        templateUrl: 'register.html',
        controller: 'RegisterController'
      })
    .when('/forgotPassword', {
        templateUrl: 'forgotpassword.html',
        controller: 'forgotController'
      })
   .when('/home', {
       templateUrl: 'views/home.html',
    })
    .otherwise({
       redirectTo: '/login'
    });
//    $locationProvider.html5Mode(true); //Remove the '#' from URL.
}]);

我有login.html,register.html和forgetpassword.html,home.html。每个人都在单独的文件中有独立的控制器。 login.js,register.js,forgot.js,home.js。

login.js

'use strict';

angular.module('myApp').controller('LoginController', function($scope, $location, $window) {
    $scope.user = {};
    $scope.loginUser=function()
    {
        var username=$scope.user.name;
        var password=$scope.user.password;
        if(username=="admin" && password=="admin123")
        {
            $location.path( "/home" );  
        }
        else
        {
            $scope.message="Error";
            $scope.messagecolor="alert alert-danger";
        }
    }
});

同样,我在其他控制器中发布了方法。

我想要的是,当视图是登录或注册或忘记密码时,正文类应为"login-layout"。所以在正文中我放了class="{{bodylayout}}“。我知道使用全局变量,可以设置值。但我不知道如何。

app.js 中我尝试了这个

angular.module('myApp').factory("myService", function(){

      return {
        sharedObject: { data: 'login-layout' }
      }; 

    });

但不知道如何使用它。

4 个答案:

答案 0 :(得分:19)

您可以双向创建全局变量

使用$rootScope,您可以执行类似LoginController控制器

的操作
angular.module('myApp').controller('LoginController', function($scope, $location, $window, $rootScope) {
   $scope.user = {};
   $rootScope.bodylayout = 'login-layout';

   //others code 
}

使用service

angular.module('myApp').factory("myService", function(){

      return {
        sharedObject: { data: 'login-layout' }
      }; 

});

在您的控制器中使用此服务

angular.module('myApp').controller('LoginController', function($scope, $location, $window, myService) {
       $scope.user = {};
       $rootScope.bodylayout = myService.sharedObject.data; // get data from service

       //others code 
    }

HTML的展示位置

<body class="{{bodylayout}}">

注意在这种情况下,您需要在每个控制器中设置bodylayout,否则它会使用旧值

答案 1 :(得分:10)

尝试使用$ rootScope:

$rootScope.bodyClass = 'login-layout';

<body class="{{$root.bodyClass}}">

您可以通过侦听routeChangeSuccess在各个控制器中处理,也可以在app.js中处理:

$rootScope.$on('$routeChangeSuccess', function (event, currentRoute) {
    switch(currentRoute.templateUrl) {
        case 'login.html':
        case 'register.html':
        case 'forgotpassword.html':
            $rootScope.bodyClass = 'login-layout';
            break;
        default:
            $rootScope.bodyClass = '';
            break;
    }
});

答案 2 :(得分:8)

您可以创建一个<body>指令,添加和删除可在整个应用中触发的类事件。

angular.module('myApp').directive('body', [function(){
  return {
    restrict: 'E',
    link: function(scope, element, attrs) {
      scope.$on('body:class:add', function(e, name){
        element.addClass(name);
      };
      scope.$on('body:class:remove', function(e, name){
        element.removeClass(name);
      };
      return;
    }
  };
}]);

app.js config区块中,您可以<body>

class $emit设置为您想要的任何内容
## Add class
$rootScope.$emit('body:class:add', 'login-layout')

## Remove class
$rootScope.$emit('body:class:remove', 'login-layout')

它只是简单地使用角度jqLit​​e addClass()removeClass(),并且也不要求您使用已经拥有dom的指令$element功能来使用link访问该元素。

即使没有$rootScope,您也可以使用$scope.$emit('body:class:add', name)在控制器中调用它。

答案 3 :(得分:1)

我不太确定建议的答案适用于Angular 1.4x,但我认为我有一个更简单的解决方案。

您可以轻松地将activeTab属性添加到您的路线中,如下所示:

.when('/register', {
        templateUrl: 'register.html',
        controller: 'RegisterController',
        activeTab: 'register'
      })

然后在Controller中将$ route对象添加到$ scope:

.controller('RegisterController', ['$scope', '$route', function($scope, $route){
     $scope.$route = $route;
}])

在身体标签上使用ng-class:

<body ng-class="{'register-class' : $route.current.activeTab == 'register' }">
</body>

这样,您可以在更改路径时在body标签上动态设置类。希望这有助于某人!