fteschke

fteschke

Handle user input before hooks mounted

I use this pattern to handle user input before JS has loaded / hooks have mounted:

<button onclick="this.$clicked = true" phx-hook="MyHook" phx-click={JS.dispatch('clicked')} />
// my_hook.js
mounted() {
  this.el.addEventListener('clicked', () => { ... })

  if (this.el.$clicked) {
    this.js().exec(this.el.getAttribute('phx-click'))
  }
}

This works quite well. But I would prefer a global solution rather than extending each relevant hook.

Ideally:

// app.js
document.querySelectorAll('[onclick="this.$clicked = true]').forEach(el => {
  if (el.$clicked) {
    window.liveSocket.execJS(el, el.getAttribute('phx-click'))
  }
})

However, there is a timing problem.
If phx-click dispatches an event that the hook needs to handle, the hook must have been mounted (attached it’s event listener) first.

So I want to delay my app.js code until all hooks have been mounted.
Is there any way to do this (I was hoping for a phx:all-hooks-mounted event)?
Or is there an entirely different approach to achieving this?

First Post!

LostKobrakai

LostKobrakai

You could probably do phx-mounted={JS.dispatch("maybe-clicked")}

Most Liked

fteschke

fteschke

Agreed, disabling the interactive elements would work. Best without any visual style changes (suppress any button ‘disabled’ styles) to avoid flickering on page load.

Similar line of thought: Optimize page load times (small JS bundle, chunk splitting, …, check caching).

Even so, if any one has thoughts in case above is not enough, please let me know.

fteschke

fteschke

I want to handle click events that occurred before the JS bundle loaded.
Such events may be handled by JS hooks.
For the event to be properly handled, the respective hook may have to be mounted and have registered its event listeners.

So before I can “retry” the phx-click handler for each element that was early clicked, I need to make sure that any hook that may be listening to events dispatched from that phx-click has been mounted.
I can solve this problem per element/hook by knowing which elements and hooks are related.
But I would rather have a global solution that doesn’t require this level of knowledge. In that case I think the easiest solution is to wait until all hooks have mounted before “retrying” the phx-click handlers.

Where Next?

Popular in Questions Top

Qqwy
Original source of discussion: This topic on the Pragmatic Programmers’ Functional Web Development with Elixir, OTP, and Phoenix forum. ...
New
hariharasudhan94
Lets say I have map like this fetching from my database %{"_id" =&gt; #BSON.ObjectId&lt;58eb1a7a9ad169198c3dXXXX&gt;, "email" =&gt; ...
New
skosch
To my knowledge, put_in, Map.update etc. all have the one limitation of not automatically creating intermediate keys when needed (for exa...
New
stefanchrobot
What’s the safe way to decode a JSON string into a struct? I want to avoid calling String.to_atom. Jason.decode can give me a map with st...
New
sen
Hi All, I set a environment variables in dev.exs , like below code. when i start server, how can i set the ${enable} value? thanks. d...
New
alice
Hey, Just curious what are the main benefits of Elixir compared to Clojure? When is Elixir more useful than Clojure and vice versa? Th...
New
romenigld
I am trying to run a deploy with docker and I successfully runned with this command: docker build -t romenigld/blog-prod . but when I t...
New

Other popular topics Top

Brian
What is the proper way to load a module from a file in to IEX? In the python world, doing something like this pretty standard: from ....
New
openscript
Hello! Sorry for this astonishing simple question, but I’m really stuck. I try to set up the intellij-elixir plugin, but I don’t know ho...
New
AstonJ
Seen any cool LiveView demos, sample apps or examples? Please post them here! :003:
New
WestKeys
Currently suffering from paralysis by [HTTP client] analysis. This is rather unusual in Elixirland as there tends to be consensus on the ...
New
JorisKok
I have a server on AWS, and was running a load test using artillery. When looking at the Phoenix dashboard I see the Ports going to 100% ...
New
Harrisonl
We have an ECS cluster with 4 services, where each task joins a single cluster, via discovery ECS discovery service. Currently when I de...
New

We're in Beta

About us Mission Statement