30

我正在开发一个使用 Angularjs 和 Twitter Bootstrap 的项目。

Bootstrap 使用 # 来切换诸如 popover、modal 等组件,例如:

<a href="#myModal" role="button" class="btn" data-toggle="modal">Launch demo modal</a>

<!-- Modal -->
<div id="myModal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
  <div class="modal-header">
    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
    <h3 id="myModalLabel">Modal header</h3>
  </div>
  <div class="modal-body">
    <p>One fine body…&lt;/p>
  </div>
  <div class="modal-footer">
    <button class="btn" data-dismiss="modal" aria-hidden="true">Close</button>
    <button class="btn btn-primary">Save changes</button>
  </div>
</div>

问题是当我单击具有此类 href 属性的按钮时,会导致整个页面重新加载,这意味着当前页面中的所有内容都丢失了。 有没有办法防止这种情况?

一些额外的信息:

当我将鼠标悬停在按钮上时,网址很奇怪。例如,我当前页面的 url 是

localhost:8080/#/account

按钮的href是

href="#myModal"

我希望看到网址

localhost:8080/#/account#myModal

然而,我看到的是

localhost:8080/#myModal

我不确定这是否与我的问题有关。

提前致谢!

编辑 1

我看过Stewie谈到的另一篇文章。它解释了 angularjs 中的 html5mode 和 hashbang,但并没有真正解决我的问题。

我尝试放置html5mode,当我点击按钮时它仍然重新加载页面

4

7 回答 7

27

这是因为 Angular 的 HTML 链接重写,这里解释。

为防止重写位置,请添加target=_self到这些引导链接。

所以不是<a href="#myModal">你需要<a href="#myModal" target="_self">

于 2014-08-05T21:30:47.507 回答
11

Angular 中的 hashbang 用于路由。查看教程以更深入地了解它是如何工作

您还应该看看Angular UI Bootstrap

常规 Boostrap 在构建时并未考虑到 Angular,因此很少有与 Angular 不符的东西。因此团队决定将 Boostrap 移植到 Angular 指令中,让您能够充分使用 Angular 的ng-功能(仅使用常规 Boostrap 无法轻松做到这一点)。


由于路由的工作方式,我认为你不能做你想做的事,而且你不应该这样做。由于您将<a>用作按钮,因此将其设为常规按钮并添加ng-click

<button class="btn btn-primary" ng-click="openDialog()">Open Dialog</button>

这是 Angular 的方式(以及 Angular UI Bootstrap 的工作方式)。

最后,在 Angular 中,这里<a>是一个指令文档,所以如果你想阻止默认点击,请离开href=""

<a href="" ng-click="model.$save()">Save</a>
于 2013-06-22T15:29:16.397 回答
6

我解决了:只需通过 DATA-TARGET 属性更改 HREF 属性。

<div>
    <!-- Nav tabs -->
    <ul class="nav nav-tabs" role="tablist" id="myTabs">
        <li role="presentation" class="active">
            <a data-target="#home" aria-controls="home" role="tab" data-toggle="tab">Home</a>
        </li>
        <li role="presentation">
            <a data-target="#profile" aria-controls="profile" role="tab" data-toggle="tab">Profile</a>
        </li>
    </ul>

    <!-- Tab panes -->
    <div class="tab-content">
        <div role="tabpanel" class="tab-pane active" id="home">Tortor Porta Sit</div>
        <div role="tabpanel" class="tab-pane" id="profile">Duis mollis, est non commodo</div>
    </div>
</div>

于 2016-02-01T16:12:53.213 回答
4

这里有一个更简单的解决方案:How to prevent redirecting <a href="#something"> in Angular Js1.2

只需添加target="_self"到您的链接

于 2017-07-24T14:44:17.340 回答
1

我有类似的问题,整页重新加载与仅查看切换。

因为 Angular 应用程序是 SAP,我们只更新主机名/#/ 之后的内容。

我实例化了一个 SuperController,一种应用程序级控制器,就像 Carlos V 所说,你可以使用 ng-click 而不是 href 来更新$location.path()

这是一个小提琴链接

可能不是最优化的解决方案。希望能帮助到你。

于 2013-06-22T15:58:57.930 回答
0

在你的 js 中使用这样的东西

$('a').on('click',function(e){

    e.preventDefault();
});

只要确保你为你的'a'上课,否则你会为所有的a做。

于 2017-02-08T08:11:35.550 回答
-9

继续并进行以下更改,将 javascript:void(0) 而不是 #myModal 用于 href。使用 Javascript 通过点击事件触发您的模式打开。

    <a href="javascript:void(0)" onClick="openModal()" role="button"...

    function openModal(){
      $("#myModal").moda();
    }
于 2013-06-22T14:41:36.703 回答