【问题标题】:How to use variable in phoenix framework in a handle_event function?如何在 handle_event 函数中使用 phoenix 框架中的变量?
【发布时间】:2022-12-21 22:54:11
【问题描述】:

我想有两种不同形式的两个输入字段(见下文)。第一个提交用户名并将其保存在变量 client_name 中。这似乎工作正常。

当第二个提交时,我想抓住 client_name 变量并在我创建的字符串中使用它。但我不知道怎么办。

defmodule ChatWeb.ChatLive do 
use ChatWeb, :live_view

@topic "message_received"

    def mount(params, session, socket) do
        ChatWeb.Endpoint.subscribe(@topic)
        {:ok, assign(socket, :text_value, "") |>assign(:client_name, "")}
    end
    
    def render(assigns) do
    ~H"""
        <h1>Chat</h1>
        <form phx-submit="submit_name">
            <label>Your name: <%= @client_name %><input id="client" type="text" name="client" /></label>
            <input type="submit" />
        </form>
        <form phx-submit="submit">
            <label>Your Text:<input id="msg" type="text" name="input_value" /></label>
            <input type="submit" />
        </form>
        <div id="chat">
            Chat history: <%= @text_value %>
        </div>
        
    """
    end
    
    def handle_event("submit_name", %{"client" => client}, socket) do
        {:noreply, assign(socket, :client_name, client)}
    end
    
    def handle_event("submit", %{"input_value" => msg}, socket) do
        ChatWeb.Endpoint.broadcast_from(self(), @topic, "message_received_received", "| Message by #{client_name}: '" <> msg <> "' ")
        {:noreply, assign(socket, :text_value, "| Message by #{client_name}: '" <> msg <> "' " <> socket.assigns.text_value)}
    end
    
    def handle_info(%{topic: @topic, payload: new_message}, socket ) do
        {:noreply, assign(socket, :text_value, new_message <> socket.assigns.text_value)}
    end
    

结尾

问题出在#{client_name} 正确的记法是什么?

我的错误是:undefined function client_name/0

【问题讨论】:

    标签: templates variables input elixir apache-phoenix


    【解决方案1】:

    您对 client_name 的呼叫应更改为 socket.assigns.client_name,因为这是您将值放入 handle_event("submit_name", ...) 的位置。

    或者,您可以在函数子句中绑定 client_name 赋值:

    def handle_event("submit", %{"input_value" => msg}, %{assigns: %{client_name: client_name}} = socket) do
    

    在这种情况下,您不需要在函数体中修复 client_name

    【讨论】:

      猜你喜欢
      • 2016-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-04
      • 2020-12-08
      • 2019-04-09
      相关资源
      最近更新 更多