feat(aio): add LocationService.path() method (#16139)
This enables things like embedded components easy access to a clean version of the current location path.
This commit is contained in:
parent
5461182e25
commit
6ed812ff75
|
@ -124,6 +124,37 @@ describe('LocationService', () => {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('path', () => {
|
||||||
|
it('should ask Location for the current path without the hash', () => {
|
||||||
|
const location: MockLocationStrategy = injector.get(LocationStrategy);
|
||||||
|
const service: LocationService = injector.get(LocationService);
|
||||||
|
|
||||||
|
// We cannot test this directly in the following test because the `MockLocationStrategy`
|
||||||
|
// does not remove the hash from the path, even if we do pass `false`.
|
||||||
|
|
||||||
|
spyOn(location, 'path').and.callThrough();
|
||||||
|
service.path();
|
||||||
|
expect(location.path).toHaveBeenCalledWith(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return the current location.path, with the query and trailing slash stripped off', () => {
|
||||||
|
const location: MockLocationStrategy = injector.get(LocationStrategy);
|
||||||
|
const service: LocationService = injector.get(LocationService);
|
||||||
|
|
||||||
|
location.simulatePopState('a/b/c?foo=bar&moo=car');
|
||||||
|
expect(service.path()).toEqual('a/b/c');
|
||||||
|
|
||||||
|
location.simulatePopState('c/d/e');
|
||||||
|
expect(service.path()).toEqual('c/d/e');
|
||||||
|
|
||||||
|
location.simulatePopState('a/b/c/?foo=bar&moo=car');
|
||||||
|
expect(service.path()).toEqual('a/b/c');
|
||||||
|
|
||||||
|
location.simulatePopState('c/d/e/');
|
||||||
|
expect(service.path()).toEqual('c/d/e');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('search', () => {
|
describe('search', () => {
|
||||||
it('should read the query from the current location.path', () => {
|
it('should read the query from the current location.path', () => {
|
||||||
const location: MockLocationStrategy = injector.get(LocationStrategy);
|
const location: MockLocationStrategy = injector.get(LocationStrategy);
|
||||||
|
|
|
@ -42,6 +42,16 @@ export class LocationService {
|
||||||
return url.replace(/^\/+/, '');
|
return url.replace(/^\/+/, '');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the current path, without trailing slash, hash fragment or query params
|
||||||
|
*/
|
||||||
|
path(): string {
|
||||||
|
let path = this.location.path(false);
|
||||||
|
path = path.match(/[^?]*/)[0]; // strip off query
|
||||||
|
path = path.replace(/\/$/, ''); // strip off trailing slash
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
search(): { [index: string]: string; } {
|
search(): { [index: string]: string; } {
|
||||||
const search = {};
|
const search = {};
|
||||||
const path = this.location.path();
|
const path = this.location.path();
|
||||||
|
|
|
@ -7,6 +7,8 @@ export class MockLocationService {
|
||||||
setSearch = jasmine.createSpy('setSearch');
|
setSearch = jasmine.createSpy('setSearch');
|
||||||
go = jasmine.createSpy('Location.go').and
|
go = jasmine.createSpy('Location.go').and
|
||||||
.callFake((url: string) => this.urlSubject.next(url));
|
.callFake((url: string) => this.urlSubject.next(url));
|
||||||
|
path = jasmine.createSpy('Location.path').and
|
||||||
|
.callFake(() => this.urlSubject.getValue().split('?')[0]);
|
||||||
handleAnchorClick = jasmine.createSpy('Location.handleAnchorClick')
|
handleAnchorClick = jasmine.createSpy('Location.handleAnchorClick')
|
||||||
.and.returnValue(false); // prevent click from causing a browser navigation
|
.and.returnValue(false); // prevent click from causing a browser navigation
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue