angularjs Angular :把一个URL解析成一个路由和参数,而不跟随那个URL?

czq61nw1  于 2022-12-26  发布在  Angular
关注(0)|答案(2)|浏览(149)

假设我有一个使用$routeProvider的Angular应用程序,我已经初始化了$routeProvider,如下所示:

$routeProvider
  .when('/foo/:var1', {
    templateUrl: 'templates/template-1.html',
    controller: 'SomeController'
  })
  .when('/bar/:var2a/:var2b', {
    templateUrl: 'templates/template-2.html',
    controller: 'SomeOtherController'
  })....

现在假设我有一个URL,我想知道它将Map到的路由的信息(特别是它包含哪些路由参数及其值),而不是实际遵循该路由,那么$route$routeParams$routeProvider等Angular 服务是否提供了一个函数,在给定URL的情况下,将该信息返回给我?
举个例子,如果我的站点托管在example.com,并且我调用了这样一个函数,传入参数'http://example.com#/bar/2/blue',我希望它返回(包含)一个对象,如

{ var2a: 2, var2b: 'blue' }

我想既然Angular的路由服务显然有能力将浏览器地址栏中的URLMap到一个路由和参数列表中,那么可能有一种方法可以在我的应用程序中为任何URL利用此功能,而无需实际导航到该URL。有这种方法吗?如果没有,是否有第三方库/插件可以与Angular集成并完成此操作?
(In如果你好奇的话我这样做的原因是,如果用户删除应用程序中的实体,我可以清除应用程序“最近访问”快捷方式列表中引用该实体ID的任何URL,这样用户就不会试图导航到不再存在的项。)
谢谢任何帮忙的人!

bprjcwpo

bprjcwpo1#

$routeParams正是您要查找的。您的SomeOtherController将如下所示:

.controller('SomeOtherController', function($routeParams) {
    var myParams = $routeParams; //{ var2a: 2, var2b: 'blue' }
});
  • 编辑:* 在重新阅读您的帖子后,我意识到您似乎希望在控制器之外完成此操作,因此$routeParams不是该场景的正确选择。

在这种情况下,您可以使用$location来获取路径和任何相关的查询,但您需要解析它并自己分配对象,因为$location不知道:var2a:var2b。Angular没有提供一个原生函数来解析资源结构中的URL,而不像$routeProvider那样实际路由到它们。
你应该让删除控制器来处理删除相关内容的逻辑,或者至少启动一个任务,让其他东西来处理这个问题。

ajsxfq5m

ajsxfq5m2#

如果您需要更灵活地在复杂的URL结构中查找特定的路由元素和最终组件名称,我发现此方法非常有用,具有容错性和未来证明。

import { PRIMARY_OUTLET, Router, UrlSegment, UrlSegmentGroup, UrlTree } from '@angular/router';
const routeTree: UrlTree = this.router.parseUrl(this.router.url);
    const routeSegmentGroup: UrlSegmentGroup = routeTree.root.children[PRIMARY_OUTLET];
    let segmentList: UrlSegment[];
    let lastComponentName: string = "/";
    let firstRouteSegName: string = "";

    if (routeSegmentGroup != undefined) {
      segmentList = routeSegmentGroup.segments;
      firstRouteSegName = segmentList[0].path;
      lastComponentName = segmentList[segmentList.length-1].path;
    }

    console.log("first: " + firstRouteSegName);
    console.log("last: " + lastComponentName);

相关问题