Deprecation Guide for
Deprecate Route#renderTemplate
The Route#render
and Route#renderTemplate
APIs have been deprecated. These APIs are largely holdovers from a time where components where not as prominent in your typical Ember application and are no longer relevant. See RFC #418.
The migration plan here is going to be somewhat situational based on the UI that was being constructed. For cases where named outlets were being used it is likely that they should just be moved to components. For cases where you were escaping the existing DOM hierarchy to render a template somewhere else in the DOM, one should use the built-in {{in-element}}
helper or an addon like ember-wormhole. Below are some example of how a migration would look.
Migrating Named Outlets
Given:
class CheckoutRoute extends Route {
// ...
renderTemplate() {
this.render('cart', {
into: 'checkout',
outlet: 'cart',
controller: 'cart'
})
}
}
{{! checkout.hbs}}
<section id="items">
{{outlet}}
</section>
<aside>
{{outlet "cart"}}
</aside>
This would tell Ember to render cart.hbs
into checkout.hbs
at the {{outlet "cart"}}
and use the cart
controller to back the cart.hbs
template.
We can migrate this entirely to use components.
{{! checkout.hbs}}
<section id="items">
{{outlet}}
</section>
<aside>
<Cart />
</aside>
Migrating Hiearchy Escaping
class CheckoutRoute extends Route {
// ...
@action
showModal() {
this.render('modal', {
outlet: 'modal',
into: 'application'
});
}
@action
hideModal() {
this.disconnectOutlet('modal');
}
}
{{! app/templates/checkout.hbs}}
<button {{on "click" this.showModal}}>Show Modal</button>
<button {{on "click" this.closeModal}}>Close Modal</button>
{{! app/templates/application.hbs}}
{{outlet "modal"}}
<main>
{{outlet}}
</main>
This can transitioned to:
class CheckoutController extends Controller {
// ...
@tracked isModalOpen = false;
init() {
super.init();
this.modalElement = document.getElementById('modal');
}
@action
showModal() {
this.isModalOpen = true;
}
@action
closeModal() {
this.isModalOpen = false;
}
}
{{! app/templates/checkout.hbs}}
<button {{on "click" this.showModal}}>Show Modal</button>
<button {{on "click" this.closeModal}}>Close Modal</button>
{{#if this.isModalOpen}}
{{#in-element this.modalElement}}
<Modal />
{{/in-element}}
{{/if}}
{{! app/templates/application.hbs}}
<div id="modal"></div>
<main>
{{outlet}}
</main>
The above example will conditionally append the modal component into div#modal
whenever the user toggles the modal.