elixir - 在 Phoenix Liveview 中,如何更改按钮标签以指示作业状态
问题描述
LiveView 是否会在将值添加到分配时更新 DOM,例如assign(socket, strLabel: "Push me")
?或者当handle_event 返回 { .. , socket} 时?我有一个按钮,单击时从数据库中读取。我希望在读取数据库时将按钮标签更改为“正在读取...”。以下是我的尝试,但临时标签“正在阅读..”从未出现。
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
推荐阅读
- java - 如何停止包含阻塞操作的线程?
- ansible - 想要在 YAML 中的多行文本中添加空格
- reactjs - Redux Saga 似乎在进行未知的 API 调用?
- odoo-11 - 如何在 Odoo-11 中设置多个公司在同一个会计科目表上工作?
- arrays - 如何在 nodejs 回调之前遍历整个数组?
- python - 延迟调用函数
- kubernetes - 如何在不杀死部署的情况下刷新 Worker Secret?
- python - Flask - 如果当前用户未通过身份验证,如何重定向到登录页面?
- sql - 如何将日期函数用作子查询?
- javascript - 使用 XMLHttpRequest() 打开本地(格式错误的)XML 时出错