带有html5Mode的Angularjs普通链接


76

我正在html 5模式下使用angularjs。似乎可以控制页面上的所有href。但是,如果我想链接到该应用程序同一域中但实际上不在该应用程序中的内容,该怎么办?一个示例是pdf。

如果我做的<a href="https://stackoverflow.com/pdfurl">角度会尝试使用html5mode并使用路由提供程序来确定应加载哪个视图。但是我实际上希望浏览器以常规方式转到该页面。

唯一的方法是与路由提供者制定规则,并使用window.location将其重定向到正确的页面吗?

Answers:


148

在HTML5模式,存在其中A标记不被改写三种情况:从角文档

  • 包含target属性的链接。例:<a href="https://stackoverflow.com/ext/link?a=b" target="_self">link</a>
  • 指向不同域的绝对链接 Example: <a href="http://angularjs.org/">link</a>
  • 以'/'开头的链接在base定义时导致不同的基本路径Example: <a href="https://stackoverflow.com/not-my-base/link">link</a>

所以你的情况是1.添加 target="_self"


多么奇怪的解决方法,但非常感谢!我认为Angular应该提供一种更漂亮的方式来发出信号
。.– Dark_eye

1
这不是解决办法。原因是将A其作为指令处理。
爱德华·加莫纳尔

34

从Angular v1.3.0开始rewriteLinks,位置提供程序有一个新的配置选项。这将关闭“劫持”页面上的所有链接:

module.config(function ($locationProvider) {
    $locationProvider.html5Mode({
        enabled: true,
        rewriteLinks: false
    });
});

尽管对所有链接都禁止这种行为可能不是您的意图,但我向其他人发布了此信息,这些人像我一样,只想$location在html5模式下使用以更改URL而不影响所有链接。


6

如果您不希望Angular控制href。在链接上放置目标属性。

因此,PDF将通过html5mode和routeProvider传递,浏览器将直接转到该URL。


3

其他解决方案。所有链接将正常工作(重新加载页面)。标ng-href="https://stackoverflow.com/path"有的链接将在pushState上播放。小型JS hack帮助。

.config(["$locationProvider", function($locationProvider) {
    // hack for html5Mode customization
    $('a').each(function(){
        $a = $(this);
        if ($a.is('[target]') || $a.is('[ng-href]')){
        } else {
            $a.attr('target', '_self');
        }
    });

    $locationProvider.html5Mode(true);
}])

1
+1。爱德华·加蒙纳尔(Eduard Gamonal)的答案是最完整的,但这在目标标签的使用上显然是一个很大的变化,并且与我的团队正在计划提取由另一个团队维护的共享标头的情况特别相关。
Derek Greer

3
由于这是一个.config文件,难道这不会只运行一次吗?也就是说,如果您有多个包含内容的虚拟页面,这似乎只会扫描DOM中当前的那些条目,而不会扫描以后作为URL路径的一部分读取的条目。
ryanm '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.