首先,这个问题可以通过多种方式解决。这种方式可能不是最优雅的,但它确实有效。
这是一个简单的解决方案,您应该可以将其添加到任何项目中。当您配置您可以用来关闭的路由时,您可以添加一个“pageKey”或其他一些属性。此外,您可以在 $route 对象的 $routeChangeSuccess 方法上实现一个监听器,以监听路由更改是否成功完成。
当您的处理程序触发时,您会获得页面键,并使用该键来定位需要为此页面“激活”的元素,然后应用 ACTIVE 类。
请记住,您需要一种使所有元素“处于活动状态”的方法。如您所见,我在导航项目上使用 .pageKey 类将它们全部关闭,并且我正在使用 .pageKey_{PAGEKEY} 单独打开它们。将它们全部切换为非活动状态,将被认为是一种幼稚的方法,通过使用先前的路线仅使活动项目处于非活动状态,您可能会获得更好的性能,或者您可以更改 jquery 选择器以仅选择要使其处于非活动状态的活动项目。使用 jquery 选择所有活动项目可能是最好的解决方案,因为它可以确保为当前路由清理所有内容,以防上一个路由上可能存在任何 css 错误。
这意味着更改这行代码:
$(".pagekey").toggleClass("active", false);
到这个
$(".active").toggleClass("active", false);
这里是一些示例代码:
给定一个引导导航栏
<div class="navbar navbar-inverse">
<div class="navbar-inner">
<a class="brand" href="#">Title</a>
<ul class="nav">
<li><a href="#!/" class="pagekey pagekey_HOME">Home</a></li>
<li><a href="#!/page1/create" class="pagekey pagekey_CREATE">Page 1 Create</a></li>
<li><a href="#!/page1/edit/1" class="pagekey pagekey_EDIT">Page 1 Edit</a></li>
<li><a href="#!/page1/published/1" class="pagekey pagekey_PUBLISH">Page 1 Published</a></li>
</ul>
</div>
</div>
还有一个 Angular 模块和控制器,如下所示:
<script type="text/javascript">
function Ctrl($scope, $http, $routeParams, $location, $route) {
}
angular.module('BookingFormBuilder', []).
config(function ($routeProvider, $locationProvider) {
$routeProvider.
when('/', {
template: 'I\'m on the home page',
controller: Ctrl,
pageKey: 'HOME' }).
when('/page1/create', {
template: 'I\'m on page 1 create',
controller: Ctrl,
pageKey: 'CREATE' }).
when('/page1/edit/:id', {
template: 'I\'m on page 1 edit {id}',
controller: Ctrl, pageKey: 'EDIT' }).
when('/page1/published/:id', {
template: 'I\'m on page 1 publish {id}',
controller: Ctrl, pageKey: 'PUBLISH' }).
otherwise({ redirectTo: '/' });
$locationProvider.hashPrefix("!");
}).run(function ($rootScope, $http, $route) {
$rootScope.$on("$routeChangeSuccess",
function (angularEvent,
currentRoute,
previousRoute) {
var pageKey = currentRoute.pageKey;
$(".pagekey").toggleClass("active", false);
$(".pagekey_" + pageKey).toggleClass("active", true);
});
});
</script>