Как обрабатывать формы с помощью Phoenix LiveView

#phoenix-framework

#phoenix-framework

Вопрос:

У меня есть форма в phoenix, которая выглядит следующим образом

 <%= form_for @changeset, Routes.post_path(@conn, :create, @post), [method: "post", multipart: true], fn f -> %>
  <div class="row mt-3">
    <div class="form-group col-6">
      <%= input f, :title, "Title", [class: "form-control", type: "text", placeholder: "Enter Title", required: true] %>
    </div>
    <div class="form-group col-6">
     <%= input f, :description, "Description", [class: "form-control", type: "text", placeholder: "Enter Description", required: true] %>
    </div>
  </div>
  <div class="d-flex mt-3">
   <%= submit "Create Post" %>
  </div>
<% end %>
 

Приведенная выше форма работает нормально, теперь я хочу изменить эту форму для реализации LiveView. Итак, я сделал что-то вроде этого

 <%= form_for @changeset, "#", [method: "post", multipart: true], fn f -> %>
  <div class="row mt-3">
    <div class="form-group col-6">
      <%= input f, :title, "Title", [class: "form-control", type: "text", placeholder: "Enter Title", required: true] %>
    </div>
    <div class="form-group col-6">
     <%= input f, :description, "Description", [class: "form-control", type: "text", placeholder: "Enter Description", required: true] %>
    </div>
  </div>
  <div class="d-flex mt-3">
   <button phx-click="create-post" phx-value="form-value">Create Post"</button>
  </div>
<% end %>

 

Я запутался в том form-value , что нужно отправить, чтобы я получил правильные данные формы, которые содержат title и description в моей handle_event функции.

Я также пытался передать @changeset and f , но они отправляют правильные phx-value , которые будут содержать мои title and description .

Не уверен, правильно ли я реализую форму с LiveView или это нужно сделать по-другому.

Ответ №1:

Единственное отличие здесь в том, что вы не хотите использовать анонимную функцию с form_for .

 
<%= form_for @changeset, "#", [phx_submit: "post", multipart: true], fn f -> %>
...
<% end %>
 

становится

 <%= f = form_for @changeset, "#", [phx_submit: "post", multipart: true] %>
...
</form>
 

Содержимое анонимной функции не может быть разделено.

Ответ №2:

Это правильный способ реализации формы с помощью Phoenix liveview

 <%= form_for @changeset, "#", [phx_submit: "post", multipart: true], fn f -> %>
  <div class="row mt-3">
      <div class="form-group col-6">
        <%= input f, :title, "Title", [class: "form-control", type: "text", placeholder: "Enter Title", required: true] %>
      </div>
      <div class="form-group col-6">
       <%= input f, :description, "Description", [class: "form-control", type: "text", placeholder: "Enter Description", required: true] %>
      </div>
    </div>
    <div class="d-flex mt-3">
      <%= submit "Create Post", phx_disable_with: "Posting..." %>
    </div>
<% end %>