gpt4 book ai didi

javascript - 如何从 javascript 与 liveview 正确通信

转载 作者:行者123 更新时间:2023-12-03 07:08:07 26 4
gpt4 key购买 nike

我正在尝试在触发 Javascript 事件后使用 Javascript 更新 Liveview。
Liveview 必须显示 <div>带有一些从 Javascript 发送的值的元素。
我的问题是:我应该如何将这些值从 Javascript 传递到 Liveview?
我可能还需要 Liveview 在 Javascript 中发送的值。再说一遍:我应该如何将这些值从 Liveview 传递给 Javascript?
在 Javascript 中创建了一个 Livesocket 以供 liveview 工作,但我看不到从那里获取或设置分配值的方法。
从/到 Liveview 传递值的唯一方法似乎是在某些时候通过 DOM。例如:

<div id="lv-data" phx-hook="JavascriptHook"></div>
let hooks = {};
hooks.JavascriptHook = {
mounted(){

this.el.addEventListener("jsEvent", (e) =>
this.pushEvent("jsEventToPhx", e.data, (reply, ref) =>
console.log("not sure what to do here")));

this.handleEvent("phxEventToJS", (payload) => console.log("data received: " + payload));
}
}
不得不将 DOM 与虚拟 <div> 一起使用感觉很奇怪完全用于纯粹的数据交换......

最佳答案

是您的LiveView用于处理 jsEventToPhx 的模块您从前端发送的事件?您必须有 parent LiveViewLiveViewComponent它实现了 handle_event/3此消息的回调。看:
https://hexdocs.pm/phoenix_live_view/Phoenix.LiveView.html#c:handle_event/3
例如(在您的 LiveView 模块中):

def handle_event("jsEventToPhx", params, socket) do
# Here the `params` variable is what you are sending form the
# client-side, so it will be `%{foo: "bar"}` if you
# follow the next example.
{:reply, %{hello: "world"}, socket}
end
然后在你的 Hook 中,你只需要使用 this.pushEvent :
let hooks = {};
hooks.JavascriptHook = {
mounted(){
this.pushEvent("jsEventToPhx", {foo: "bar"}, (reply, ref) =>
// this will print `{hello: "world"}`
console.log(reply);
}
}
}
当您想要将数据发送到 LiveView 并选择立即接收响应时,这是一种方法。
如果你想从 LiveView 发送一些东西到客户端,则过程略有不同。在 LiveView 中,您使用 push_event从任何 handle_event 返回套接字时回调,例如:
{:noreply, push_event(socket, "phxEventToJS", %{abc: "xyz"})}
在你的 Hook 中,你订阅了事件:
mounted(){
this.pushEvent("jsEventToPhx", {foo: "bar"}, (reply, ref) =>
// this will print `{hello: "world"}`
console.log(reply);
}

this.handleEvent("phxEventToJS", (payload) => {
// this will print `{abc: "xyz"}`
console.log(payload);
}
}
检查客户端-服务器通信部分可能很有用 here .

关于javascript - 如何从 javascript 与 liveview 正确通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62850762/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com