Rerender on new route or transition

I’m building a banner ad plug-in. I have a section of the DOM that I need to re-render each time the page transitions. I have attempted (unsuccessfully) both a Widget and Ember Component, but neither are updating. I loaded them via a Plugin Outlet. I even tried to simplify the problem and dump the current timestamp of the load to the screen (rather than a banner), but only get a re-render if I refresh the browser.

Can someone please point me in the right direction for a solution? I’ve been through the main Discourse developer tutorials, BTW. Just seems like I’m missing something simple.

In which place you are trying to render? In Discourse most of the header UI sections will not refresh across page transactions unlike you hit browser refresh.

And can you post your code to see how you are doing it.

The plugin outlet right above the topic list.

Maybe you can try the following code (not tested):

// My plugin initializer
export default {

	name: 'myPlugin',

	initialize(container) {

		// Reopen the router to add a didTransition hook
		const router = container.lookup('router:main')
		router.reopen({
			doSomething: function() {
				// Wait for rendering to be over. THIS DOESN'T WORK IN ALL CASES. 
				// In fact, there is no way to be sure rendering is complete, because 
				// a 'complete rendering' is meaningless (think about a looping DOM  
				// animation)
				Ember.run.schedule('afterRender', null, () => {
					// Do your stuff here
					...
				})
			}.on('didTransition')
		})

	}

}

Can anyone guide on this further?

Can you please explain what you’re trying to achieve?

Need to add a component in footer area and update content of it on every page load when user visits a topic. It is a slider which contains top topics of our community and only visible on topics page for anonymous users. So, as user visits each topic which is present in slider, that slide needs to be removed from component. Mounting it using below footer outlet doesn’t re-render the component

When the “footer” is rendered in Discourse, the app sends an “event”

The event is inserted-custom-html:footer

You can use that event to update your footer content like so

api.onAppEvent("inserted-custom-html:footer", () => {
  // add your JS here
});

There’s a few more details here.

This should work for what you’re trying to achieve. If it doesn’t, let me know - and post the code you’re using.

2 Likes

I’d like to place a dynamic content in the top of the homepage (only).

What is currently the best practice to let it re-render with each page transition to the homepage?

I’d appreciate any link to an existing plugin that uses this…