#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
»