Size: a a a

2020 April 21

YT

Yauheni Tsiarokhin in pro.elixir
ладно буду думать
источник

LL

Lama Lover in pro.elixir
Ну, смотри, ты генерируешь div-ы, а это изменяет DOM. У тебя инпуты находятся в одном диве с генерируемой частью - это точно нужно изменить, ещё нужно определить phx-update и дать дивам их id и name и всё такое
Вот мой темплейт, который нормально работает
<form phx-submit="submit" phx-throttle="2000">
 <input
   type="text"
   name="userinput"
 >
 <label>Logged as <%= @myname %></label>
</form>
<div id="chat-messages" name="div" phx-update="append">
 <%= for message <- @messages do %>
   <div id="msgid<%= message.id %>">
     <p>
       <span><%= message.author %>: </span>
       <%= for line <- message.text  do %>
         <%= line %> <br>
       <% end %>
     </p>
   </div>
 <% end %>
</div>
источник

M

Maxim in pro.elixir
Yauheni Tsiarokhin
а вот и вопрос
у меня каждую секнуду тригерится апдейт вьюхи
и на странице есть форма с двумя инпутами
во время апдейта текст который был в инпуте пропадает

както нужно это прекратить
сохраняй name и expire в сокет при апйдете форме и читай в форму из сокетов и резетай когда произошел сабмит.

но мне тут больше вопрос - зачем тебе апдейтить лайвьюху каждую секунду?
источник

YT

Yauheni Tsiarokhin in pro.elixir
Maxim
сохраняй name и expire в сокет при апйдете форме и читай в форму из сокетов и резетай когда произошел сабмит.

но мне тут больше вопрос - зачем тебе апдейтить лайвьюху каждую секунду?
в форму руками инфу планируется вводить
источник

YT

Yauheni Tsiarokhin in pro.elixir
так что не понимаю что ты имеешь в виду под чтением в форму из сокета
источник

M

Maxim in pro.elixir
phx-change="check" у тебя шлются ивенты при вводе сюда, сохраняй что пользователь вверх тут
источник

M

Maxim in pro.elixir
<input type="text" name="name" value="@name" /> и возращай тут
источник

M

Maxim in pro.elixir
тогда он не будет пропадать после каждой секунды)
источник

M

Maxim in pro.elixir
ну опять же - инетерсует вопрос, для чего ты апдейтишь? и что ты апдейтишь?
источник

YT

Yauheni Tsiarokhin in pro.elixir
я апдейчу список активити
хочу таймер рядом с каждым показывать
источник

YT

Yauheni Tsiarokhin in pro.elixir
и то что ты предлагаешь звучит как жесткий костыль
источник

YT

Yauheni Tsiarokhin in pro.elixir
как мне кажется
источник

M

Maxim in pro.elixir
Yauheni Tsiarokhin
и то что ты предлагаешь звучит как жесткий костыль
именно, что-то тут не так с timer
источник

M

Maxim in pro.elixir
где ты вызываешь handle_info(:update, %{assigns: assigns} = socket) в маунте?
источник

YT

Yauheni Tsiarokhin in pro.elixir
нет я выставляю таймер в маунте
источник

YT

Yauheni Tsiarokhin in pro.elixir
таймер то тут причем
источник

YT

Yauheni Tsiarokhin in pro.elixir
Lama Lover
Ну, смотри, ты генерируешь div-ы, а это изменяет DOM. У тебя инпуты находятся в одном диве с генерируемой частью - это точно нужно изменить, ещё нужно определить phx-update и дать дивам их id и name и всё такое
Вот мой темплейт, который нормально работает
<form phx-submit="submit" phx-throttle="2000">
 <input
   type="text"
   name="userinput"
 >
 <label>Logged as <%= @myname %></label>
</form>
<div id="chat-messages" name="div" phx-update="append">
 <%= for message <- @messages do %>
   <div id="msgid<%= message.id %>">
     <p>
       <span><%= message.author %>: </span>
       <%= for line <- message.text  do %>
         <%= line %> <br>
       <% end %>
     </p>
   </div>
 <% end %>
</div>
чтото я скопировал твой темплейт не помогает
источник

VS

Vladimir Sekisov in pro.elixir
Yauheni Tsiarokhin
  def handle_info(:update, %{assigns: assigns} = socket) do
   %{activities: activities} = assigns
   new_activities = Enum.map(activities, &update_activity/1)
   :ok = schedule_update()
   {:noreply, assign(socket, :activities, new_activities)}
 end
если это lv, то handle_event("add", ..) должен быть, а не handle_info и он тут еще будет "check" на каждую букву генерить
источник

YT

Yauheni Tsiarokhin in pro.elixir
Vladimir Sekisov
если это lv, то handle_event("add", ..) должен быть, а не handle_info и он тут еще будет "check" на каждую букву генерить
так ща скину весь код в студию
там его мало совсем
источник

YT

Yauheni Tsiarokhin in pro.elixir
defmodule HelloWeb.TestLive do
 use HelloWeb, :live_view

 @impl true
 def mount(_params, _session, socket) do
   :ok = schedule_update()
   {:ok, assign(socket, :activities, [])}
 end

 @impl true
 def handle_event("check", params, socket) do
   IO.puts("CHECKING: #{inspect params}")
   {:noreply, socket}
 end

 @impl true
 def handle_event("add", params, %{assigns: assigns} = socket) do
   IO.puts("ADDING: #{inspect params}")
   expire = String.to_integer(params["expire"])
   name = (params["name"])
   activity = %{total_time: expire, remaining_time: expire, name: name}
   activities = [activity | Map.get(assigns, :activities)]
   {:noreply, assign(socket, :activities, activities)}
 end

 def handle_info(:update, %{assigns: assigns} = socket) do
   %{activities: activities} = assigns
   new_activities = Enum.map(activities, &update_activity/1)
   :ok = schedule_update()
   {:noreply, assign(socket, :activities, new_activities)}
 end

 defp update_activity(%{remaining_time: 0} = activity), do: activity
 defp update_activity(activity) do
     Map.update!(activity, :remaining_time, &(&1 - 1))
 end

 defp schedule_update() do
   Process.send_after(self(), :update, 1_000)

   :ok
 end
end
источник