【问题标题】:Can AngularJS routing be used for some URLs and regular GET requests used for others?AngularJS 路由是否可以用于某些 URL,而常规 GET 请求可以用于其他 URL?
【发布时间】:2019-12-13 07:12:04
【问题描述】:

我在一个最初使用传统导航(HTTP GET 和 POST)并且没有 AJAX/Fetch 功能的 ASP.NET MVC 应用程序上工作。随着时间的推移,我们引入了 AngularJS 以利用双向绑定和其他 UI 改进,但每个页面仍然是它自己独立的应用程序/模块。也就是说,我们不使用 AngularJS 路由,而是当页面加载时,它是一个传统的 GET 请求。这意味着 angular.js 每次都加载和引导,页面本身是一个独立的模块和控制器。

我们想开始使用 AngularJS 的路由来使我们应用程序的某些部分充当 SPA,最终目标是使整个站点成为一个使用 AngularJS 路由的 SPA。以应用程序的规模和我们的小团队,一次完成所有工作是不可行的,所以我们需要逐步完成。

是否可以让某些 URL 使用 AngularJS 的路由,但让其他 URL 进行完整的页面加载 (GET)?例如:

+------------------------------+-------------------------------+-------------------+
|         Current URL          |      URL to navigate to       |  Navigation type  |
+------------------------------+-------------------------------+-------------------+
| site.com/employee/edit/42    | site.com/employee/contacts/42 | AngularJS routing |
| site.com/employee/edit/42    | site.com/branch/settings/123  | Traditional GET   |
| site.com/branch/settings/123 | site.com/employee/edit/42     | Traditional GET   |
+------------------------------+-------------------------------+-------------------+

软件同一“部分”内的页面(在本例中为/employee/*)将属于同一个 AngularJS 模块,并且在该模块内的页面之间导航将使用 AngularJS 路由。所有其他导航将依赖于常规 GET 请求。

【问题讨论】:

  • 你运行的是什么网络服务器?
  • @MichaelNovello IIS 8
  • 尤其是在混合环境中,我不会选择html5Mode,而只是使用哈希来创建 angularjs 路由。在您的示例中,我将用于任何 angula 路线 site.com/#employee/edit/42 并且所有其他请求应该保持不变 - 一旦您转换了所有代码,您就可以考虑 $locationProvider.html5Mode(true) 但这将是我最后的担忧

标签: angularjs angularjs-routing


【解决方案1】:

这个问题的答案是肯定的。

我首先建议将 ui-router 项目用于所有路由。他们的文档非常好,Angular 团队建议在他们自己的路由器上这样做。

此库的默认路由模式利用文档片段进行导航,因此如果您将 AngularJS 站点托管在 site.com/employee/spa/index.html 上,您可以通过文档片段使用 ui-router 库管理您的所有路由。

所以你会看到类似的东西

site.com/employee/spa/#!/contacts/42
site.com/employee/spa/#!/contacts/3000
site.com/employee/spa/#!/contacts/42/detail

等等……

如果您直接请求这些 url 之一,您使用的任何网络服务器都不会看到这些文档片段,只会看到 site.com/employee/spa。一旦页面呈现,ui-router 将处理路由/数据解析。

您可能出于某些原因不想使用文档片段。这方面的一个示例是与 oAuth 服务上的单点登录集成。当重定向回您的站点时,他们也将无法使用文档片段,因此您将始终必须在您的根位置接受他们的请求。

为此你可以切换到html5mode:https://docs.angularjs.org/api/ng/provider/$locationProvider#html5Mode

在这种模式下,文档片段将消失。这意味着您的网络服务器将看到所有完整的 url 请求,而不是

site.com/employee/spa/#!/contacts/3000

他们将发送

site.com/employee/spa/contacts/3000

您可以在您的网络服务器中配置规则,将所有请求重定向到 site.com/spa/employee 之后的任何内容以转到 site.com/employee/spa/index.html 以解决此问题。不过,这取决于您使用的网络服务器。

除非您绝对需要使用 html5mode,否则我个人会坚持使用默认设置。

编辑:为您的水疗路线添加了一条 SPA 路径,我没有意识到您指定了两条员工路线。您绝对应该在员工之前添加一些东西,指定某个部分是特定于 SPA 的。

编辑编辑:您可以慢慢将您的其他员工路线迁移到 spa 并开始为您的其他路线做同样的事情,最终所有内容都可以迁移到 /spa/ 根目录,您可以完全消除对它的需求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-26
    • 2011-10-20
    • 2011-07-07
    • 2017-04-06
    • 2021-10-21
    • 1970-01-01
    • 2016-08-26
    • 2012-01-28
    相关资源
    最近更新 更多