1

我的应用程序有两个不同的视图(page1 和 page2),它们已配置为ui-router's stateProvider。我想根据我正在查看的页面在正文上应用 css。如果我正在查看 page1,我想将其应用于class1页面正文和class2page2。

为了实现这一点,我使用ng-classangularjs. ng-class指令的值是根据ui-router.

这是它的示例代码,问题是内部的表达式ng-class没有得到评估,所以我的css没有得到应用。

谁能指出我做错了什么?

<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.2/angular.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-router/0.4.2/angular-ui-router.min.js"></script>

    <style media="screen">

    h2 {
      margin: 5px 5px 5px 5px;
    }
    body {
      display: flex;
      flex-direction: column;
    }
    .class1 {
      align-items: flex-start;
    }
    .class2 {
      align-items: center;
    }
    </style>
  </head>

  <body ng-app="graceApp" ng-class="$state.current.data.bodyClass">

    <div ui-view style="display: flex"></div>

    <script>
    angular
      .module('graceApp', [
        'ui.router'
      ])
      .config(function ($stateProvider, $urlRouterProvider) {
        $stateProvider
          .state('page1', {
            url: '/page1',
            template: '<h2>This is page1</h2> <h2>Item1</h2> <h2>Item2</h2>',
            data: {
              bodyClass: 'class1'
            }
          })
          .state('page2', {
            url: '/page2',
            template: '<h2>This is page2</h2> <h2>Item1</h2> <h2>Item2</h2>',
            data: {
              bodyClass: 'class2'
            }
          });
        $urlRouterProvider.otherwise('/page1');
      });
    </script>
</body>
</html>
4

3 回答 3

2

$state 服务在 HTML 中不可用。您只需在 html 中访问范围中设置的变量,因此快速解决方法是在 rootScope 中设置状态,然后您可以在 HTML 中访问它。

$rootScope.$state = $state;
于 2017-03-03T09:36:37.290 回答
1

我不确定是否$state可以像这样在 HTML 中访问服务。您是否考虑在控制器中创建一些将返回的函数$state.current.data.bodyClass,然后将该函数链接到ng-class

function getClass() {
    return $state.current.data.bodyClass;
}

HTML:

<body ng-app="graceApp" ng-class="getClass()">

如果您使用的是 controllerAs 模式,请确保将此函数设为公开,并在 HTML 中使用控制器别名使用它。

于 2017-03-03T09:29:06.253 回答
1

您不能$state直接在 html 中访问,因此您需要在控制器中定义另一个范围变量,例如

<!doctype html>
<html ng-app="graceApp">

<head>
    <meta charset="utf-8">
    <title></title>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.2/angular.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-router/0.4.2/angular-ui-router.min.js"></script>
    <style media="screen">
    .class1 {
        background-color: red;
    }

    .class2 {
        background-color: green;
    }
    </style>
</head>
<body ng-controller="mainController" ng-class="bodyClass">
    <div ui-view></div>
    <script>
    angular.module('graceApp', ['ui.router']).config(function($stateProvider, $urlRouterProvider) {
        $stateProvider
            .state('page1', {
                url: '/page1',
                template: '<h2>This is page1</h2> <h2>Item1</h2> <h2>Item2</h2>',
                data: {
                    bodyClass: 'class1'
                }
            })
            .state('page2', {
                url: '/page2',
                template: '<h2>This is page2</h2> <h2>Item1</h2> <h2>Item2</h2>',
                data: {
                    bodyClass: 'class2'
                }
            });
        $urlRouterProvider.otherwise('/page1');
    });

    angular.module("graceApp").controller("mainController", function($rootScope, $scope) {
        $rootScope.$on("$stateChangeSuccess", function(event, current, params) {
            console.log(current.data.bodyClass);
            $scope.bodyClass = current.data.bodyClass;
        });
    });
    </script>
</body>
</html>
于 2017-03-03T09:42:27.110 回答