我需要在 Angular 2 中获取没有参数的当前路线,我找到了一种使用参数获取当前路线的方法,如下所示:
this.router.url
然后拆分它:
this.router.url.split(';')[0]
但这看起来是一种解决方法,我认为应该有更好的方法?
我需要在 Angular 2 中获取没有参数的当前路线,我找到了一种使用参数获取当前路线的方法,如下所示:
this.router.url
然后拆分它:
this.router.url.split(';')[0]
但这看起来是一种解决方法,我认为应该有更好的方法?
要获取没有查询参数的当前路线,您可以使用下面提到的单行:
this.router.url.split('?')[0]
parseTree
fromRouter
帮助在不了解 url 结构的情况下获取段。
import { Router } from '@angular/router';
...
constructor(private router: Router) {}
...
const urlTree = this.router.parseUrl(url);
const urlWithoutParams = urlTree.root.children['primary'].segments.map(it => it.path).join('/');
从这里开始。如果您有辅助插座,请根据需要进行调整。
对我来说,这是我设法做到的最干净的解决方案。我希望它有帮助
import { Router } from '@angular/router';
constructor(private router: Router){}
getUrlWithoutParams(){
let urlTree = this.router.parseUrl(this.router.url);
urlTree.queryParams = {};
urlTree.fragment = null; // optional
return urlTree.toString();
}
简短而简单的纯js。
location.pathname
本机 javascript 将用于将 url 拆分为逻辑部分。查看“位置”(或 window.location)对象。例如,在 URL https://example.com/pathname1/pathname2?queryParam1=1&queryParam2=2处使用位置会产生
location.origin === 'https://example.com/pathname1/pathname2'
location.href === 'https://example.com/pathname1/pathname2?queryParam1=1&queryParam2=2'
location.pathname === '/pathname1/pathname2'
location.search === '?queryParam1=1&queryParam2=2'
如果您使用的是webpack,则可以使用捆绑的url
polyfill模块以及 AngularRouter
模块。
import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import * as url from 'url'
@Component({
selector: 'app-component',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss']
})
export class AppComponent implements OnInit {
public constructor(public readonly router: Router) {}
public ngOnInit() {
const urlInfo = url.parse(this.router.url)
console.log(urlInfo.pathname)
}
}
我有类似的要求,具体取决于我用来获取组件的路径,我想要不同的结果。
我发现这activatedRoute.routeConfig.path
是一个很好的选择,让我很容易看到使用了哪条路线。
constructor(private activatedRoute: ActivatedRoute) {}
ngOnInit() {
if (this.activatedRoute.routeConfig.path === 'heroes/:id')
这可以帮助你:
导入路由器:
import { Router } from '@angular/router';
构造函数中的签名:
constructor(private _router: Router) {}
检查_router events 属性:
this._router.events
.subscribe(
(url:any) => {
let _ruta = "";
url.url.split("/").forEach(element => {
if(element!=="" && _ruta==="")
_ruta="/"+element;
});
console.log("route: "+_ruta); //<<<---- Root path
console.log("to URL:"+url.url); //<<<---- Destination URL
console.log("from URL:"+this._router.url);//<<<---- Current URL
});
要获取没有查询参数的当前路线,您可以使用下面提到的单行:
this.url = this.url.substr(0, this.url.lastIndexOf("?"));
在我的情况下,我需要比较以前的路由和新路由,当通过router.navigate仅更改url 上的:id时。由于我想要没有不同 id 的路径,所以我得到了路由的原始路径:
/*
Routes = [
{ path: 'main/details/:id', component: DetailComponent }
]
previousRoute = '/main/details/1'
newRoute = '/main/details/2'
*/
this.routeSubscription = this.router.events.filter((event) => event instanceof ResolveStart)
.pairwise() // returns previous and current events
.subscribe((ev: [ResolveStart, ResolveStart]) => {
let sameRoute = ev[0].state.root.firstChild.routeConfig.path == ev[1].state.root.firstChild.routeConfig.path ?
ev[0].state.root.firstChild.routeConfig.path : undefiend;
if (sameRoute) {
// Same routes, probably different ids
console.log(sameRoute) // gives 'main/details/:id'
} else {
// Different routes
}
});
我在接受答案中使用 locationStrategy ,但使用.split()
方法。LocationStrategy 在 Angular 4 和 Angular 5 中完美运行;
import {LocationStrategy} from '@angular/common';
export class MyService {
constructor(private locationStrategy: LocationStrategy) {
}
public getUrl(filters: FilterConfig[]): void {
const url = this.locationStrategy.path();
const urlArray = url.split('?');
return urlArray[0];
}
}
您应该进行的另一件事是确保<router-outlet>
在尝试获取locationStrategy.path()
. 如果<router-outlet>
未初始化任何 Angular 服务,则无法正确返回 URL 和查询参数。
为确保您的位置策略已初始化,您可以使用 subscribe 方法,例如:
this.router.events.subscribe((evt) => {
...
}
但是在这种情况下,您会在每次路由器更改时触发您的功能,因此如果不需要,您需要保护这种情况。
这些都不适合我。
有很多方法可以解决这个问题,但在这种情况下,有一个保护措施可以阻止用户访问特定的 URL。这工作得很好,除非 URL 有参数,因为传递的 URL 总是包含所有参数。
例如:myPage/param1/param2
或者: myPage?param1=1¶m2=2
在这种情况下,我只想要myPage
.
我编写了下面的代码,我不喜欢它,我确信它可以改进,但到目前为止还没有找到任何其他有效的方法:
let url: string = state.url;
let urlParams: string[];
if (url.includes("?")) {
url = url.substr(0, url.indexOf('?'));
} else {
urlParams = route.url.toString().split(';')[0].split(',');
if (urlParams.length > 1) {
urlParams.shift(); // Remove first element which is page name
// Get entire splitting on each param
let fullUrlSegments: string[] = state.url.split('/');
// Remove number of params from full URL
fullUrlSegments = fullUrlSegments.slice(0, fullUrlSegments.length - urlParams.length);
url = fullUrlSegments.join('/');
}
}
alert(url);
state.url
来自CanActivate
(或注入Router
)的实现。
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) Observable<boolean> { ... }