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,