You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Phoenix框架中如何在handle_event函数中使用client_name变量?

问题解决:Phoenix LiveView中获取assigns变量的正确方式

你遇到的undefined function client_name/0错误,是因为在handle_event("submit", ...)函数里直接写client_name时,Elixir会将其视为一个函数调用,但你并没有定义这个函数。实际上,你之前通过assign/3保存的client_name是存在socket的assigns结构体里的,必须从这里读取。

修复步骤

  • 在submit事件的处理函数中,先从socket.assigns中提取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
        # 从socket.assigns中取出client_name
        client_name = socket.assigns.client_name
        message = "| Message by #{client_name}: '#{msg}' "
        ChatWeb.Endpoint.broadcast_from(self(), @topic, "message_received_received", message)
        {:noreply, assign(socket, :text_value, message <> 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
    
end

关键修改点

  • 在handle_event("submit", ...)里新增了client_name = socket.assigns.client_name,从socket的assigns中获取之前保存的用户名
  • 将消息字符串的构建改为使用提取后的client_name变量,避免了不存在的函数调用错误

内容的提问来源于stack exchange,提问作者Athshe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 22:10:09