摆脱 #!在 angularjs ngRoute [重复]

Posted

技术标签:

【中文标题】摆脱 #!在 angularjs ngRoute [重复]【英文标题】:Getting rid of #! in angularjs ngRoute [duplicate] 【发布时间】:2017-11-20 16:45:23 【问题描述】:

我正在使用 Angularjs ngRoute for SPA 与 Node.js 作为我的后端,我的网站中有 3 个页面说:

localhost:8000/#!/ localhost:8000/#!/red localhost:8000/#!/green

通过谷歌搜索,我找到了摆脱 /**#!**/ 的方法,并且只有当用户无意按 F5 重新加载页面时它才能正常工作。如果重新加载,我的页面结构会变得更糟。我的意思是,如果用户在red.html 页面中按 F5,则单独显示 red.html 而不是在 ng-View 中注入 red.html 内容这就是 nodejs 的本质获取请求。有什么办法可以摆脱这个问题?

index.html

<body ng-app="myApp">
  <p><a href="/">Main</a></p>
  <a href="/red">Red</a>
  <a href="/green">Green</a>

  <ng-view></ng-view>

  <script>
    var app = angular.module("myApp", ["ngRoute"]);
    app.config(function($routeProvider, $locationProvider) 
      $routeProvider
        .when("/", 
          templateUrl: "/main"
        )
        .when("/red", 
          templateUrl: "/red"
        )
        .when("/green", 
          templateUrl: "/green"
        )

      $locationProvider.html5Mode(true);
    );

  </script>
</body>

【问题讨论】:

在哪里注入 HTML 内容? red.html 应该被加载到 ng-view 里面有什么问题那么缺少什么? 如果重新加载 red.html 没有在 ng-view 中注入。而是单独显示(只显示red.htm,没有html标签,head标签等) 如果你重新加载这个 URL localhost:8000/red 你配置的路由 .when("/red", ... 应该被加载。 URL 中不应有 .html 之类的后缀。有什么问题? 这并不是您问题的真正答案,但恕我直言,不要使用 ngRoute。请改用 ui-router (github.com/angular-ui/ui-router)。 当您使用html5mode 时,您必须配置服务器以考虑虚拟目录。不要使用与页面路径相同的模板路径,否则服务器无法区分 【参考方案1】:

您正在使用node.jsexpress,对吗?这样,只需将您的所有应用程序视图路由链接到您的 index.html 并将您的部分视图放在其他子目录中以避免路由冲突:

//resources 
app.use("/js", express.static(__dirname + "/js"));
app.use("/img", express.static(__dirname + "/img"));
app.use("/css", express.static(__dirname + "/css"));

//different path for your partials to avoid route conflicts
app.use("/partials", express.static(__dirname + "/partials"));

//view routes
app.get('/*', function(req, res)
    res.sendFile(__dirname + '/index.html');
);

这样你的所有路线:

localhost:8000/ localhost:8000/red localhost:8000/green

将指向您的index.html。所以你的$routeProvider 将能够以正确的方式注入视图,而你的index.html 每次都会被加载。

最后你的路由配置应该是这样的:

var app = angular.module("myApp", ["ngRoute"]);
app.config(function($routeProvider, $locationProvider) 
  $routeProvider
    .when("/", 
      templateUrl: "/partials/main.html"
    )
    .when("/red", 
      templateUrl: "/partials/red.html"
    )
    .when("/green", 
      templateUrl: "/partials/green.html"
    )

  $locationProvider.html5Mode(true);
);

【讨论】:

当客户端路由模板使用相同路径时不起作用 @charlietfl 哦,是的,让我更正一下。 HI lin,很明显,如果我在 chrome 的 URL 中键入 localhost:3000/partials/red.html 并按回车会发生什么...我的答案是 red.html 将单独显示为页面将 red.html 的内容注入 ng-view @annapoorani 是的,但这可能发生在您的所有公共资源上。这是一个正常的情况,所以并没有什么异常。即使您只允许它通过 AJAX 请求加载,您也不能预先访问公共资源。您的应用程序路由不直接指向您的资源,这样用户就不会以/partials/red.html 结束。你期待什么? 不仅适用于公共资源。但对于重新加载和 F5 案例也是我的确切问题【参考方案2】:

问题是,如果您使用 html5-mode 并按 F5,您的服务器应该提供的不是您的 red.html,而是您的 index.html。那是因为必须引导 angular 并解析您的 url 以获得正确的位置。

编辑:规则是:

    如果您调用(或 F5 或直接导航)http://localhost:8000,则必须从服务器获取 index.html。 如果您调用(或 F5 或直接导航)http://localhost:8000/red,那么您也必须从服务器获取 index.html。

奖金:

您应该从定义的位置(如http://localhost:8000/static/)或从另一个域提供静态内容(图像、css、html 模板),以便获得静态文件和 url 路径的明确路径

【讨论】:

我不能承认你的规则 2...如果你直接打电话 localhost:8000/red express 将发送红色(静态文件)索引将如何发送该 get 请求 查看 lin 的回答。

以上是关于摆脱 #!在 angularjs ngRoute [重复]的主要内容,如果未能解决你的问题,请参考以下文章

AngularJS:使用ngRoute路由时未加载组件控制器

AngularJS ngRoute 和 PHP $_SESSION 变量

angularjs之插件ngRoute和ngAnimate

AngularJs练习Demo16 ngRoute

AngularJs练习Demo17 ngRoute

AngularJS之高级Route