【发布时间】:2013-11-28 11:49:32
【问题描述】:
我在我的应用程序中使用了 AngularJs-1.0.7 和 Bootstrap。最近我从 AngularJs-1.0.7 迁移到 AngularJs-1.2。我正在使用 Bootstrap 的 Accordions 和 Tabs。
Tab 的 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 之间的/。因此,在单击 Tab 时,它会重定向到 http://web_url/#/firstTab 。如何解决这个问题?
我的解决方案
我找到了解决此问题的方法。我为标签写了一个指令。在该指令中,我检查了 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 更好。如果你愿意,我可以修改代码并作为答案发送。 -
if(/^#/.test(attrs.href))将适用于以#开头的所有链接。 -
尝试添加
target="_self"它通常会禁用链接上的角度路由。 -
在这些基于 bootstrap angular-ui.github.io/bootstrap 的原生 Angular 指令中大量使用
标签: angularjs twitter-bootstrap migration