var domain = '{{ DOMAIN }}'; // www.example.com or dev.example.com
var domain_index = window.location.href.indexOf(domain);
var long_app_name = window.location.href.slice(domain_index+domain.length+1);
// this turns http://www.example.com/whatever/whatever to whatever/whatever
app_name = long_app_name.slice(0, long_app_name.indexOf('/'));
//now you are left off with just the first whatever which is usually your app name
angular.module("app.NavigationControllersModule", [])
// Constant named 'activeTab' holding the value 'active'. We will use this to set the class name of the <li> element that is selected.
.constant("activeTab", "active")
.controller("topNavBarCtrl", function($scope, activeTab){
// Model used for the ng-repeat directive in the template.
$scope.tabs = ["Page 1", "Page 2", "Page 3"];
var selectedTab = null;
// Sets the selectedTab.
$scope.selectTab = function(newTab){
selectedTab = newTab;
};
// Sets class of the selectedTab to 'active'.
$scope.getTabClass = function(tab){
return selectedTab == tab ? activeTab : "";
};
});
<li><a class="dd">This link points to #/fun5</a>
<ul>
<li><a href="#/fun6?some=data">This link points to #/fun6</a>
</li>
<li><a href="#/fun7?some=data">This link points to #/fun7</a>
</li>
<li><a href="#/fun8?some=data">This link points to #/fun8</a>
</li>
<li><a href="#/fun9?some=data">This link points to #/fun9</a>
</li>
</ul>
</li>
25 回答
这是一个简单的解决方案
继承人我的看法 . 这篇文章中的一些答案组合 . 我的情况略有不同,所以我的解决方案是将菜单分成自己的模板,在指令定义Ojbect中使用,然后将我的导航栏添加到我需要的页面 . 基本上,我有一个登录页面,我不想包含我的菜单,所以我使用ngInclude并在登录时插入此指令:
指令:
DIRECTIVE TEMPLATE(templates / menu.html)
HTML包括指令
希望这可以帮助
我建议在链接上使用指令 . Here是小提琴 .
但它还不完美 . 注意hashbangs;)
这是javascript for指令:
以下是如何在html中使用它:
之后使用css设计样式:
如果你不想使用AngularStrap那么这个指令应该可以做到!这是https://stackoverflow.com/a/16231859/910764的修改 .
JavaScript
HTML
Note: 以上HTML类假设您正在使用Bootstrap 3.x
只需要添加所需的
active
-class以及所需的颜色代码 .例如:
ng-class="{'active': currentNavSelected}" ng-click="setNav"
你可以看一下AngularStrap,navbar指令似乎正是你要找的:
https://github.com/mgcrea/angular-strap/blob/master/src/navbar/navbar.js
要使用此指令:
从http://mgcrea.github.io/angular-strap/下载AngularStrap
在bootstrap.js之后在页面上包含脚本:
<script src="lib/angular-strap.js"></script>
将指令添加到模块中:
angular.module('myApp', ['$strap.directives'])
将指令添加到导航栏:
<div class="navbar" bs-navbar>
在每个导航项上添加正则表达式:
<li data-match-route="/about"><a href="#/about">About</a></li>
你也可以使用这个active-link指令https://stackoverflow.com/a/23138152/1387163
当位置匹配/ url时,Parent li将获得活动类:
对不起,我发现所有这些答案对我来说有点复杂 . 所以我创建了一个小指令,应该在每个导航栏的基础上工作:
用法:
您可以使用角度表达式中的条件来实现此目的,例如:
话虽这么说,我确实发现一个角度指令是更“正确”的做法,即使外包很多这种迷你逻辑可能会在某种程度上污染你的代码库 .
我在开发过程中偶尔使用条件进行GUI样式,因为它比创建指令要快一些 . 我无法告诉你一个实例,虽然它们实际上长期存在于代码库中 . 最后,我要么把它变成一个指令,要么找到一个更好的方法来解决问题 .
这对我有用:
然后你使用jquery(也可以使用angular)来添加类active
当然还有css:
这有用,如果你有这样的HTML:
如果您在www.somesite.com/ee thaen ee是'app'并且它将处于活动状态,这将使用页面URL自然地添加活动类并将背景颜色设置为红色
如果您正在使用Angular路由器,RouterLinkActive directive可以非常优雅地使用:
我使用带有$ location的ng-class指令来实现它 .
它要求导航栏位于主控制器内,可以访问$ location服务,如下所示:
一种非常优雅的方法是使用ng-controller在ng-view之外运行单个控制器:
并包含在controllers.js中:
扩展myl答案,我需要这个来处理这样的结构 .
-指数
-events <-active
---事件编辑
--- event-map <-clicked
-places
---地方列表
---地方编辑
---地方 Map
因此,我不得不使用indexOf代替匹配,以验证格式化为匹配条件的子链接 . 所以对于'事件':
JavaScript
HTML
对于可能感兴趣的人来说,这是另一种解决方案 . 这样做的好处是它具有较少的依赖性 . 哎呀,没有网络服务器也可以 . 所以它完全是客户端的 .
HTML:
说明:
这里我们使用指令
ng-repeat
从angularjs模型动态生成链接 . 魔法发生在控制器中为此导航栏定义的方法selectTab()
和getTabClass()
.控制器:
说明:
使用
ng-click
指令调用selectTab()
方法 . 因此,单击链接时,变量selectedTab
将设置为此链接的名称 . 在HTML中,您可以看到调用此方法时没有Home选项卡的任何参数,以便在页面加载时突出显示该方法 .通过调用
getTabClass()
方法HTML中的ng-class
指令 . 此方法检查它所在的选项卡是否与selectedTab
变量的值相同 . 如果为true,则返回"active" else返回“”,它由ng-class
指令作为类名应用 . 然后,您应用于类active
的任何CSS都将应用于所选选项卡 .感谢@Pylinux . 我已经使用了他的技术并修改了它以支持"one"级别的下拉菜单(sub ul / li),因为这就是我所需要的 . 在下面的小提琴链接中查看它的实际操作 .
根据pylinux的答案更新了小提琴 - http://jsfiddle.net/abhatia/en4qxw6g/
我做了以下三个更改,以支持一个级别的下拉菜单:
1.为li下的"a"元素添加了dd(下拉列表)的类值,需要有子ul列表 .
2.更新了Javascript以添加以下新逻辑 .
3.更新了CSS以添加以下内容:
希望这对想要实现单级下拉菜单的人有所帮助 .
结合@Olivier 's AngularStrap answer, I also implemented kevinknelson'的答案来自:https://github.com/twbs/bootstrap/issues/9013 .
本地,Bootstrap3导航栏不是为单页(例如Angular)应用程序设计的,因此在小屏幕上的菜单在点击时不会折叠 .
如果您使用ui-router,以下示例应根据@ DanPantry对已接受答案的评论满足您的需求,而无需添加任何控制器端代码:
您可以查看docs以获取更多信息 .
你实际上可以使用angular-ui-utils'
ui-route
指令:要么:
Headers 控制器
索引页面
如果您正在使用ui-utils,您可能也对ui-router感兴趣以管理部分/嵌套视图 .
我刚刚编写了一个指令来处理这个,所以你可以简单地将属性
bs-active-link
添加到父<ul>
元素,并且在路由改变的任何时候,它将找到匹配的链接,并将active
类添加到相应的<li>
.你可以在这里看到它:http://jsfiddle.net/8mcedv3b/
示例HTML:
使用Javascript:
这个答案很长,但我想我会分享我的方式:
模板:
对于那些使用
ui-router
的人:对于完全匹配(例如嵌套状态?),请使用
$state.name === 'full/path/to/state'
或ui-sref-active-eq="active"
这是一个适用于Angular的简单方法 .
在AngularJS控制器中:
首先,这个问题可以通过很多方式解决 . 这种方式可能不是最优雅的,但它确实有效 .
这是一个简单的解决方案,您应该可以添加到任何项目 . 您可以在配置可用于关闭的路由时添加“pageKey”或其他属性 . 此外,您可以在$ route对象的$ routeChangeSuccess方法上实现一个侦听器,以侦听路由更改的成功完成 .
当您的处理程序触发时,您获取页面键,并使用该键来查找此页面需要“ACTIVE”的元素,并应用ACTIVE类 .
请记住,您需要一种方法使所有元素“处于活动状态” . 正如你所看到我在我的导航项目上使用.pageKey类来关闭它们,我正在使用.pageKey_ 来单独打开它们 . 将它们全部切换为非活动状态将被视为一种天真的方法,可能通过使用先前的路由仅使活动项处于非活动状态可以获得更好的性能,或者您可以将jquery选择器更改为仅选择要使其处于非活动状态的活动项 . 使用jquery选择所有活动项可能是最好的解决方案,因为它可以确保在前一个路径上可能存在任何css错误的情况下清除当前路由的所有内容 .
这意味着改变这行代码:
对这一个
以下是一些示例代码:
给出一个bootstrap导航栏
和角度模块和控制器如下:
只是为了在辩论中添加我的两分钱,我已经制作了一个纯角度模块(没有jquery),它也可以使用包含数据的哈希URL . (i.g.
#/this/is/path?this=is&some=data
)您只需将模块添加为依赖项,并将
auto-active
添加到菜单的其中一个祖先 . 像这样:模块看起来像这样:
*(你当然可以使用指令部分)
**它's also worth noticing that this doesn'适用于空哈希(i.g.
example.com/#
或只是example.com
)它需要至少example.com/#/
或只需example.com#/
. 但是这会通过ngResource等自动发生 .这是小提琴:http://jsfiddle.net/gy2an/8/
这是github:https://github.com/Karl-Gustav/autoActive
这是我的原始答案:https://stackoverflow.com/a/22282124/1465640