AngularJS Изменение класса <body> с использованием глобальной переменной
Я только что создал приложение 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, forget.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";
}
}
});
Аналогично, у меня есть методы post в других контроллерах.
То, что я хочу, когда view является логином или регистром или забытым, класс body должен быть "login-layout"
. Поэтому в теле я помещаю class="{{bodylayout}}
". Я знаю, используя глобальные переменные, значение может быть установлено. Но я не знаю, как это сделать.
В app.js Я пробовал это
angular.module('myApp').factory("myService", function(){
return {
sharedObject: { data: 'login-layout' }
};
});
Но не знаю, как его использовать.
Ответы
Ответ 1
Вы можете создавать глобальные переменные двумя способами
Используя $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
в каждом контроллере, иначе он использует старое значение
Ответ 2
Попробуйте использовать $rootScope:
$rootScope.bodyClass = 'login-layout';
<body class="{{$root.bodyClass}}">
Вы можете обрабатывать это в отдельных контроллерах или, возможно, в вашем приложении app.js, прослушивая routeChangeSuccess:
$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;
}
});
Ответ 3
Вы можете создать директиву <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')
он просто использует angular jqLite addClass()
и removeClass()
, а также не требует, чтобы вы нажали на $element
с помощью функции директивы link
, которая уже имеет dom-доступ к элементу.
Даже без $rootScope
вы можете вызвать его в своих контроллерах с помощью $scope.$emit('body:class:add', name)
.
Ответ 4
Я не слишком уверен, что предлагаемые ответы работают для Angular 1.4x, но я думаю, что у меня есть более легкое решение.
Вы можете легко добавить свойство activeTab к своим маршрутам следующим образом:
.when('/register', {
templateUrl: 'register.html',
controller: 'RegisterController',
activeTab: 'register'
})
Затем в вашем контроллере добавьте объект $route в область $scope:
.controller('RegisterController', ['$scope', '$route', function($scope, $route){
$scope.$route = $route;
}])
И используйте ng-класс в теге body:
<body ng-class="{'register-class' : $route.current.activeTab == 'register' }">
</body>
Таким образом вы можете динамически устанавливать класс в теге тела при изменении маршрутов. Надеюсь, это поможет кому-то!