diff --git a/packages/@ember/-internals/glimmer/tests/integration/components/link-to/rendering-angle-test.js b/packages/@ember/-internals/glimmer/tests/integration/components/link-to/rendering-angle-test.js index 535d4897f0f..9e688cf1236 100644 --- a/packages/@ember/-internals/glimmer/tests/integration/components/link-to/rendering-angle-test.js +++ b/packages/@ember/-internals/glimmer/tests/integration/components/link-to/rendering-angle-test.js @@ -141,7 +141,7 @@ moduleFor( this.assertComponentElement(this.element.firstChild, { tagName: 'a', - attrs: { href: null }, + attrs: { href: '#/' }, content: 'Go to Index', }); } @@ -169,10 +169,24 @@ moduleFor( return this.owner.resolveRegistration('router:main'); } - ['@test should be able to be inserted in DOM when router is setup but not started']() { + ['@test should be able to be inserted in DOM when initial transition not started']() { this.render(`Link`); this.assertComponentElement(this.element.firstChild, { tagName: 'a', + attrs: { + href: null, + }, + content: 'Link', + }); + } + + ['@test should be able to be inserted in DOM with valid href when complete models are passed even if initial transition is not started']() { + this.render(`Link`); + this.assertComponentElement(this.element.firstChild, { + tagName: 'a', + attrs: { + href: '/dynamic-with-child/1/child', + }, content: 'Link', }); } diff --git a/packages/@ember/-internals/routing/lib/services/routing.ts b/packages/@ember/-internals/routing/lib/services/routing.ts index 23d850e855d..da2cf9ed5b8 100644 --- a/packages/@ember/-internals/routing/lib/services/routing.ts +++ b/packages/@ember/-internals/routing/lib/services/routing.ts @@ -52,25 +52,32 @@ export default class RoutingService extends Service { this.router._prepareQueryParams(routeName, models, queryParams); } - generateURL(routeName: string, models: {}[], queryParams: {}) { - let router = this.router; - // Return early when transition has not started, when rendering in tests without visit(), - // we cannot infer the route context which needs be aware of - if (!router._initialTransitionStarted) { - return; - } - + _generateURL(routeName: string, models: {}[], queryParams: {}) { let visibleQueryParams = {}; if (queryParams) { assign(visibleQueryParams, queryParams); this.normalizeQueryParams(routeName, models, visibleQueryParams as QueryParam); } - return router.generate(routeName, ...models, { + return this.router.generate(routeName, ...models, { queryParams: visibleQueryParams, }); } + generateURL(routeName: string, models: {}[], queryParams: {}) { + if (this.router._initialTransitionStarted) { + return this._generateURL(routeName, models, queryParams); + } else { + // Swallow error when transition has not started. + // When rendering in tests without visit(), we cannot infer the route context which needs be aware of + try { + return this._generateURL(routeName, models, queryParams); + } catch (_e) { + return; + } + } + } + isActiveForRoute( contexts: {}[], queryParams: QueryParam | undefined,