Как я могу заставить Elixir / Phoenix LiveComponent отправлять сообщение самому себе, а не его родительскому элементу?

#elixir #phoenix-framework #phoenix-live-view

#elixir #phoenix-framework #phoenix-live-view

Вопрос:

Я пишу ClockComponent, чтобы узнать о Phoenix LiveComponents. У меня почти получилось, но он отправляет сообщение :tick своему родителю. Как я могу заставить его отправлять это сообщение самому себе? Я хотел использовать myself() вместо self() , но, видимо, это не так.

 defmodule ClockComponent do
  use Phoenix.LiveComponent

  @impl true
  def mount(socket) do
    if connected?(socket), do: :timer.send_interval(1000, self(), :tick)
    {:ok, assign(socket, date: :calendar.local_time())}
  end

  def handle_info(:tick, socket) do
    {:noreply, assign(socket, date: :calendar.local_time())}
  end

  @impl true
  def render(assigns) do
    ~L"""
    The time is <%= @date |> Timex.to_datetime("America/Denver") |> Timex.format!("{RFC1123}") %>
    """
  end
end
 

Ответ №1:

Я не думаю, что вы можете на основе этого: https://hexdocs.pm/phoenix_live_view/Phoenix.LiveComponent.html#module-managing-state

Компоненты выполняются внутри процесса LiveView, но могут иметь собственное состояние и обработку событий.

Я считаю, что и «дочерний компонент», и родительский используют один и тот же процесс.

Комментарии:

1. Точно. Особенно это: » note that components do not have a handle_info/2 callback. Therefore, if you want to track distributed changes on a card, you must have the parent LiveView receive those events and redirect them »