具有Angular UI-Router的动态body类

时间:2015-01-28 23:47:45

标签: javascript angularjs angular-ui-router

我试图找到一种优雅的方式来设置正文标记的自定义动态类,我可以轻松地从ui-router configurations设置,如果没有设置,我可以使用默认选项,也可以不使用。

示例:

routes.js

$stateProvider
      .state('login', {
           url: "/login",
           template: 'Login'
      })
      .state('register', {
           url: "/register",
           template: 'Register'
      }).
      .state('profile', {
           url: "/profile",
           template: 'Profile'
      });;

简单标记HTML

<html>
   <body class=""> <!-- Dynamically class to change -->
      <div ui-view></div>
   </body>
</html>

方案:

1 - 访问state 登录我应该让正文的等于auth

2 - 此时访问state 注册,它将具有相同的auth

3 - 访问state 个人资料,正文将包含默认类或

你是如何实现这一目标的?

4 个答案:

答案 0 :(得分:28)

你可以拥有一个控制它的主AppController:

<html ng-app="app" ng-controller="AppController as appController">
...
<body class="{{ appController.bodyClasses }}">

内部AppController:

var vm = this;
vm.bodyClasses = 'default';

// this'll be called on every state change in the app
$scope.$on('$stateChangeSuccess', function(event, toState, toParams, fromState, fromParams){
    if (angular.isDefined(toState.data.bodyClasses)) {
        vm.bodyClasses = toState.data.bodyClasses;
        return;
    }

    vm.bodyClasses = 'default';
});

你的路线defs:

  .state('register', {
       url: "/register",
       template: 'Register',
       data: {
           bodyClasses: 'auth'
       }
  });

有关此数据属性策略的详情,请参阅UI Router documentation

答案 1 :(得分:27)

这里的方法与@ jmq使用状态数据类似,但实现为指令而不是控制器。 (关于该指令的好处是你可以将它应用于任何任意元素)

示例加价

object

路线配置(routes.js)

<body ng-app="app" route-css-classnames>

指令(routeCssClassnames.js)

$stateProvider
  .state('login', {
       url: "/login",
       template: 'Login',
       data : {
           cssClassnames : 'auth'
       }
  })
  .state('register', {
       url: "/register",
       template: 'Register',
       data : {
           cssClassnames : 'auth'
       }
  }).
  .state('profile', {
       url: "/profile",
       template: 'Profile'
  });

答案 2 :(得分:1)

您也可以在身体标签上或任何需要的地方使用它。

ng-class="$state.current.name"

答案 3 :(得分:0)

这只是使用ui-router@1.x转换钩子的@ JeremyWeir指令的一个版本。

import angular from 'angular';

class RouteCssClassNamesDirective {
  constructor($transitions) {
    this.$transitions = $transitions;
    this.restrict = 'A';
  }

  link(scope, element, attrs) {
    this.$transitions.onSuccess({}, (trans) => {
      const fromClassNames = angular.isDefined(trans.from().data) && angular.isDefined(trans.from().data.cssClassNames) ? trans.from().data.cssClassNames : null;
      const toClassNames = angular.isDefined(trans.to().data) && angular.isDefined(trans.to().data.cssClassNames) ? trans.to().data.cssClassNames : null;
      if (fromClassNames !== toClassNames) {
        if (fromClassNames) {
          element.removeClass(fromClassNames);
        }
        if (toClassNames) {
          element.addClass(toClassNames);
        }
      }
    });
  }

  static create() {
    return new RouteCssClassNamesDirective(...arguments);
  }

}

RouteCssClassNamesDirective.create.$inject = ['$transitions'];

export default angular.module('shared')
  .directive('routeCssClassNames', RouteCssClassNamesDirective.create);