当前位置: 首页 > 面试题库 >

$ location /在html5和hashbang模式之间切换/链接重写

郑宜民
2023-03-14
问题内容

我给人的印象是Angular会重写出现在临时模板中定位标记的href属性中的URL,以便无论在html5模式还是hashbang模式下它们都可以工作。位置服务的文档似乎说HTML链接重写可以解决哈希问题。因此,我希望当不在HTML5模式下时,将插入哈希,而在HTML5模式下,则不会。

但是,似乎没有进行任何重写。以下示例不允许我仅更改模式。应用程序中的所有链接都需要手工重写(或在运行时从变量派生。我是否需要根据模式手动重写所有URL?

我没有看到在Angular
1.0.6、1.1.4或1.1.3中进行任何客户端url重写。似乎所有的href值都必须在#/之前添加为hashbang模式,在//之前添加为html5模式。

是否需要一些配置才能引起重写?我在读文档吗?还在做傻事吗?

这是一个小例子:

<head>
    <script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.1.3/angular.js"></script>
</head>

<body>
    <div ng-view></div>
    <script>
        angular.module('sample', [])
            .config(
        ['$routeProvider', '$locationProvider',
            function ($routeProvider, $locationProvider) {

                //commenting out this line (switching to hashbang mode) breaks the app
                //-- unless # is added to the templates
                $locationProvider.html5Mode(true);

                $routeProvider.when('/', {
                    template: 'this is home. go to <a href="/about"/>about</a>'
                });
                $routeProvider.when('/about', {
                    template: 'this is about. go to <a href="/"/>home</a'
                });
            }
        ])
            .run();
    </script>
</body>

附录:在重读我的问题时,我发现我使用了“重写”一词,但对于谁和何时进行重写没有足够的明确性。问题在于如何使 Angular
在呈现路径时重写URL,以及如何使 Angular 在两种模式下统一解释JS代码中的路径。这 不是
关于如何使Web服务器做HTML5兼容的要求重写。


问题答案:

该文档对AngularJS路由不是很清楚。它讨论了Hashbang和HTML5模式。实际上,AngularJS路由以三种模式运行:

  • Hashbang模式
  • HTML5模式
  • HTML5模式下的Hashbang

对于每种模式,都有各自的LocationUrl类(LocationHashbangUrl,LocationUrl和LocationHashbangInHTML5Url)。

为了模拟URL重写,您实际上必须将html5mode设置为true并装饰$ sniffer类,如下所示:

$provide.decorator('$sniffer', function($delegate) {
  $delegate.history = false;
  return $delegate;
});

我现在将更详细地解释这一点:

组态:

$routeProvider
  .when('/path', {
    templateUrl: 'path.html',
});
$locationProvider
  .html5Mode(false)
  .hashPrefix('!');

当您需要在HTML文件(例如,

<a href="index.html#!/path">link</a>

在浏览器中,您必须使用以下链接: http://www.example.com/base/index.html#!/base/path

如您所见,在纯Hashbang模式下,HTML文件中的所有链接都必须以诸如“ index.html#!”之类的开头。

HTML5模式

组态:

$routeProvider
  .when('/path', {
    templateUrl: 'path.html',
  });
$locationProvider
  .html5Mode(true);

您应该在HTML文件中设置基础

<html>
  <head>
    <base href="/">
  </head>
</html>

在这种模式下,您可以使用HTML文件中不带#号的链接

<a href="/path">link</a>

浏览器中的链接:

http://www.example.com/base/path

HTML5模式下的Hashbang

当我们实际使用HTML5模式但在不兼容的浏览器中时,会激活此模式。通过装饰$
sniffer服务并将历史记录设置为false,我们可以在兼容的浏览器中模拟此模式。

组态:

$provide.decorator('$sniffer', function($delegate) {
  $delegate.history = false;
  return $delegate;
});
$routeProvider
  .when('/path', {
    templateUrl: 'path.html',
  });
$locationProvider
  .html5Mode(true)
  .hashPrefix('!');

在HTML文件中设置基础:

<html>
  <head>
    <base href="/">
  </head>
</html>

在这种情况下,也可以在HTML文件中不包含哈希的情况下编写链接

<a href="/path">link</a>

浏览器中的链接:

http://www.example.com/index.html#!/base/path


 类似资料:
  • 服务模式切换比较麻烦,需要您的Kubernetes支持,目前我们使用的是istio的方案,也就是说您需要在你的kubernetes上安装istio的相关服务,并且在我们的模版管理将istio所需要的几个模版配置上。才能开启此功能。 如果您没有安装Istio,可跳过此章。 依赖 在"模版管理"菜单找到Gateway、VritualService、InitContainer、IstioProxy这几个

  • 好了,现在我们总结一下模式间切换的方法 其它模式 普通模式 Esc   普通模式 插入模式 i 在光标前插入 I 在行首插入 a 在光标后插入 A 在行末插入 o 在当前行之下新建行 O 在当前行之上新建行 r 替换当前字符 R 从当前字符开始替换 普通模式 命令模式 :   普通模式 可视模式 v 可视模式 V 可视行模式 Ctrl+v 可视块模式

  • 问题内容: 大家好,我仍在从事这个libgdx项目的工作,我试图找出将屏幕切换到游戏屏幕的最佳方法。现在,当单击一个按钮时,我需要它来切换到游戏屏幕。我已经看到了一些扩展游戏类的实现方式,但是我不确定这里最好的方法是什么。如果您看到一些可以改进的代码,请告诉我。 这是主要的应用程序类: 问题答案: 这就是我始终执行屏幕切换的方式: 首先,主类需要扩展Game(From ),然后您需要具有一个新的t

  • 大家好,我仍然在做这个libgdx项目,我正在努力找出最好的方法来改变我的游戏屏幕现在,当一个按钮被点击时,我需要它转换到游戏屏幕。我见过一些扩展game类的实现,但我不确定从这里开始最好的方法是什么。如果你看到一些可以改进的代码,请让我知道。 以下是主要的应用程序类:

  • 我在class1中创建了一个场景,然后在Class2中创建了一个scene2。如何在两者之间切换? 这是第二节课,我有另一个场景。

  • 我试图在数据库中创建一个新记录,但是在我需要获取另一个记录并从中获取一些数据并将其设置为新记录之前 我的错误是什么?如何纠正?