Update of LiveComponent fails with error "component ABC with ID XYZ does not exist or it has been removed"

Hi,

I’m rendering a live component in a for loop:

 <%= for mapping_form <- inputs_for(f, :mapping)  do %>
    ...
                <.live_select
                  form={mapping_form}
                  field={:source_field}
                  phx-target={@myself}
                  options={source_field_option_list(@changeset)}
                  update_min_len={0}
                />
<% end %>

“live_select” renders a live component. What I want to do is to update the component dynamically using send_update:

send_update(LiveSelect, id: id, options: options)

This fails with the error:

send_update failed because component LiveSelect with ID "custom_mapping[mapping][0]_source_field_live_select_component" does not exist or it has been removed

However, when I inspect the DOM, I see the live compnent is there and has the expected id custom_mapping[mapping][0]_source_field_live_select_component

I’m kind of puzzled by this issue, as far as I know sending updates to LiveComponents should work even if they’re rendered in a loop.

Wondering if anyone can give me a hint or can think of any reason that would cause the LiveComponent not to be found by LiveView.

Thanks!

P.S: using the new <.inputs_for> component instead of the loop didn’t change anything

The id you need is the one you use with <.live_component id="…" />, which doesn’t necessarily match what is rendered to the DOM.

Edit:
Also consider this:

The pid argument is optional and it defaults to the current process, which means the update instruction will be sent to a component running on the same LiveView. If the current process is not a LiveView or you want to send updates to a live component running on another LiveView, you should explicitly pass the LiveView’s pid instead.

https://hexdocs.pm/phoenix_live_view/0.18.18/Phoenix.LiveView.html#send_update/2

Nope. I know for sure that it does.

I know about the PID thing too. It’s all the same LiveView process

hahah absolute brain fart :laughing:

I was using the wrong module name: it should be LiveSelect.Component not LiveSelect.

And I wrote the damn library!! I should go back and read my own docs :man_facepalming:

In my defence: It’s been a really hard week for me. I will close this topic and sorry.

1 Like