JS.push_to_client(
socket,
JS.set_attribute({"some-attr", "some-value"}, to: "#some-id")}
)
What would be the best way to accomplish that?
Background
I try to get webcomponents to work with LV.
One of the major pain points are attributes that are changed by the components, most common example is sth like @open for a drawer.
So it’s not ideal to do
~H"""
<wc-drawer open={@is_open} ... />
"""
because
If the the drawer component changes the open-state itself, it will be overwritten with the next LV-update. This can be fixed in onBeforeElUpdated for example but it gets messy
@is-open would have to be in the assigns, but it’s not really application state. It’s rather the result of the imperative drawer.open(). Also there would have to be an @is_open for each WC used.
So I think the best way would be to just command the drawer to open and forget about it afterwards.
Thanks, I knew that actually. I did to much JS the last days, my head hurts.
It does not. But if I set it in a function-component it has to be in assigns.
Say sth is happening in the backend and I want to open a drawer in response.
How should I do that if not set the open-state for a specific drawer in the assigns of the LV?
Still, I’d use push_event/3 for that. You would have a handle_event or handle_info callback in your LiveView and then call push_event so the JS hook can set the attribute accordingly (or call drawer.open() or whatever code is needed to open the drawer client-side).