В Phoenix Liveview, как изменить метки кнопок для обозначения статуса работы - PullRequest
0 голосов
/ 25 марта 2020

Обновляет ли 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

1 Ответ

0 голосов
/ 25 марта 2020

(Вот ответ от @schrockwell из канала Elixir Liveview Slack.)

Вам нужно иметь назначение, которое отслеживает состояние «чтения», например, простое логическое значение, и назначается непосредственно в handle_event, а затем порождает некоторый процесс (например, Task), который выполняет поиск в БД и отправляет сообщение обратно процессу 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
...