我原来在应用程序中使用的是AngularJs-1.0.7和Bootstrap。最近我从AngularJs-1.0.7迁移到了AngularJs-1.2。我正在使用Bootstrap的手风琴和选项卡。
选项卡的HTML代码包含如下内容:<a href="#id_for_content">
。
<ul id="myTab" class="nav nav-tabs">
<li class="active"><a href="#firstTab" data-toggle="tab">Home</a></li>
<li><a href="#secondTab" data-toggle="tab">Profile</a></li>
</ul>
<div id="myTabContent" class="tab-content">
<div class="tab-pane fade in active" id="firstTab">
<p>Content for first tab.</p>
</div>
<div class="tab-pane fade" id="secondTab">
<p>Content For second tab.</p>
</div>
</div>
在Angular的旧版本中,只有当我们使用锚标签 <a href="#/firstTab">
时才会发生路由更改。但是AngularJs-1.2重定向到 <a href="#firstTab">
,它不考虑 #
和 firstTab
之间的 /
。因此,在单击选项卡时,它会重定向到 http://web_url/#/firstTab
。如何解决这个问题?
我的解决方案
我找到了一个解决方案。我编写了一个指令来处理a标签。在该指令中检查href属性。如果匹配,则防止其默认行为。请查看以下代码。
app.directive('a', function() {
return {
restrict: 'E',
link: function(scope, elem, attrs) {
if(attrs.href === '#firstTab'|| attrs.href === '#secondTab'){
elem.on('click', function(e){
e.preventDefault();
});
}
}
};
});
但使用这种方法的问题在于,我必须在这里检查每个选项卡ID或手风琴ID。如果我为它们使用动态ID,则无法在指令中进行检查。
如果您能找到更好的解决方案,请让我们都知道。
class
指令怎么办?我的意思是,一个名为prevent-default
的指令,带有restrict:'C'
,链接函数与没有if部分相同,那么你可以通过添加类"prevent-default"
到任何地方来使用它... 像<a href="..." class="prevent-default">...</a>
,我猜我的解决方案也是一个hacky的解决方案,但比编写所有id要好。如果你希望,我可以修改代码并作为答案发送。 - Umut Benzer/^#/.test(attrs.href)
,则适用于所有以#
开头的链接。 - Adamtarget="_self"
,通常会禁用链接的 Angular 路由。 - Chris Nicola