在 Phoenix Liveview 中,如何更改按钮标签以指示作业状态
In Phoenix Liveview, how to change button labels to indicate job status
当一个值被添加到像 assign(socket, strLabel: "Push me")
这样的赋值时,LiveView 会更新 DOM 吗?或者什么时候 handle_event returns { .. , socket}?我有一个按钮,单击时从数据库中读取。我希望在读取数据库时将按钮标签更改为 "Reading..."。下面是我的尝试,但临时标签 "Reading.." 从未出现。
def handle_event("button_click", value, socket) do
socket1 = assign(socket, btnLabel: "Reading..") ##temporarily change the button label
{:ok, data} = log_list(10000, list_name)
socket1 = assign(socket, btnLabel: "Press me") ## restore original button label
{:noreply, socket1}
end
(这是来自 Elixir Liveview Slack 频道的 @schrockwell 的回复。)
你需要做的是有一个跟踪“阅读”状态的分配,就像一个简单的布尔值,并立即在 handle_event 中分配,然后产生一些进程(例如任务)执行数据库查找并在查找完成后将消息发送回 LiveView 进程
def handle_event("some_event", params, socket) do
live_view = self()
Task.start(fn ->
result = do_the_db_lookup_here()
send(live_view, {:db_result, result})
end)
{:noreply, assign(socket, busy: true)}
end
def handle_info({:db_result, result}, socket) do
{:noreply, assign(socket, result: result, busy: false)}
end
当一个值被添加到像 assign(socket, strLabel: "Push me")
这样的赋值时,LiveView 会更新 DOM 吗?或者什么时候 handle_event returns { .. , socket}?我有一个按钮,单击时从数据库中读取。我希望在读取数据库时将按钮标签更改为 "Reading..."。下面是我的尝试,但临时标签 "Reading.." 从未出现。
def handle_event("button_click", value, socket) do
socket1 = assign(socket, btnLabel: "Reading..") ##temporarily change the button label
{:ok, data} = log_list(10000, list_name)
socket1 = assign(socket, btnLabel: "Press me") ## restore original button label
{:noreply, socket1}
end
(这是来自 Elixir Liveview Slack 频道的 @schrockwell 的回复。)
你需要做的是有一个跟踪“阅读”状态的分配,就像一个简单的布尔值,并立即在 handle_event 中分配,然后产生一些进程(例如任务)执行数据库查找并在查找完成后将消息发送回 LiveView 进程
def handle_event("some_event", params, socket) do
live_view = self()
Task.start(fn ->
result = do_the_db_lookup_here()
send(live_view, {:db_result, result})
end)
{:noreply, assign(socket, busy: true)}
end
def handle_info({:db_result, result}, socket) do
{:noreply, assign(socket, result: result, busy: false)}
end