当向assign(socket, strLabel: "Push me")
之类的分配添加值时,LiveView是否更新DOM?或handle_event返回{..,socket}时?我有一个按钮,单击该按钮可从数据库读取。我希望在发生数据库读取时将按钮标签更改为“读取中...”。下面是我的尝试,但是临时标签“ 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