不同的身份背景为不同的UI路由器状态

jac*_*uac 6 css angularjs angular-ui-router

在简化的场景中,我有两个UI-Router状态,并希望它们具有不同的主体背景颜色.

理想情况下,我想做以下事情:

<body ng-class="background" ui-view>
</body>
Run Code Online (Sandbox Code Playgroud)

然后在状态控制器中设置背景类(可能是动态的,意思是:在控制器中计算):

stateHelperProvider
    .state({
        name: 'a',
        url: '/a',
        templateUrl: 'views/a.html',
        controller: function ($scope) {
            $scope.background = 'bg1';
        }
    })
    .state({
        name: 'b',
        url: '/b',
        templateUrl: 'views/b.html',
        controller: function ($scope) {
            $scope.background = 'bg2';
        }
    });
Run Code Online (Sandbox Code Playgroud)

但是将ui-view属性放在正文上会删除它.所以我必须把ui-view属性放在体内的div上.

<body>
    <div ui-view></div>
</body>
Run Code Online (Sandbox Code Playgroud)

我现在如何控制身体背景?

我知道各种hacks(例如在onEnterUI-Router 的函数中访问body的类DOM属性,...),但有一个很好的方法吗?

或者是关于制作div[ui-view]完整高度(这不是微不足道)并在此元素上设置背景来模仿如何在身体上应用背景占据整个视口

jac*_*uac 2

所以总结一下我的学习,有两种方法可以做到。两者都要求服务$state位于$rootScope. 这种优雅性可能存在争议,但我会选择这种解决方案。

  1. 如果背景类仅取决于州,请将它们添加到州的自定义数据中:

示例代码:

.state({
    ...,
    data: {
        bodyClass: 'bg1'
    }
});
Run Code Online (Sandbox Code Playgroud)

然后,在主体上放置一个 ng-class 并引用当前状态的数据:

<body ng-class="$state.current.data.bodyClass">
Run Code Online (Sandbox Code Playgroud)
  1. 如果后台类(除了状态之外)依赖于其他东西(例如状态参数或服务,...),请使用状态的解析机制

示例代码:

.state({
    ...,
    resolve: {
        bodyClass: function($stateParams) {
            // do some calculation
            return ...
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

然后,在主体上放置一个ng-class并通过以下方式引用已解析的类名$state.$current.locals.globals

<body ng-class="$state.$current.locals.globals.bodyClass">
Run Code Online (Sandbox Code Playgroud)

ng-class在这两种情况下, bodyClass 可以是对指令有效的任何内容。