diff --git a/modules/@angular/router/src/url_tree.ts b/modules/@angular/router/src/url_tree.ts index 2631c8fc40..af830edf1f 100644 --- a/modules/@angular/router/src/url_tree.ts +++ b/modules/@angular/router/src/url_tree.ts @@ -277,7 +277,11 @@ class UrlParser { } parseRootSegment(): UrlSegment { - if (this.remaining === '' || this.remaining === '/') { + if (this.remaining.startsWith('/')) { + this.capture('/'); + } + + if (this.remaining === '' || this.remaining.startsWith('?')) { return new UrlSegment([], {}); } else { return new UrlSegment([], this.parseSegmentChildren()); diff --git a/modules/@angular/router/test/url_serializer.spec.ts b/modules/@angular/router/test/url_serializer.spec.ts index 4427b38677..db56102acb 100644 --- a/modules/@angular/router/test/url_serializer.spec.ts +++ b/modules/@angular/router/test/url_serializer.spec.ts @@ -91,6 +91,13 @@ describe('url serializer', () => { expect(url.serialize(tree)).toEqual('/one;a=true'); }); + it('should parse query params (root)', () => { + const tree = url.parse('/?a=1&b=2'); + expect(tree.root.children).toEqual({}); + expect(tree.queryParams).toEqual({a: '1', b: '2'}); + expect(url.serialize(tree)).toEqual('/?a=1&b=2'); + }); + it('should parse query params', () => { const tree = url.parse('/one?a=1&b=2'); expect(tree.queryParams).toEqual({a: '1', b: '2'});