在my Phoenix / Elixir样板Web应用程序中,我具有描述的典型结构here,其中简单的HelloController
使用HelloView组件在hello/
中呈现模板夹。这样可以。
现在,假设我要添加snake_view.ex
视图组件here。此视图取决于Phoenix
LiveView,并且与其他呈现模板的普通视图略有不同,因为它在其他功能中具有render
方法:
defmodule HelloWeb.SnakeView do
use Phoenix.LiveView
# ..
def render(%{game_state: :over} = assigns) do
# ..
现在,在添加LiveView
依赖项之后,我在router.ex
中添加了一条路由
get "/snake", SnakeController, :index
但是现在我不知道如何从这个新的SnakeView
中引用SnakeController
:
defmodule HelloWeb.SnakeController do
use HelloWeb, :controller
def index(conn, _params) do
render(conn)
end
end
前往http://localhost:4000/snake时遇到的错误是
function HelloWeb.SnakeView.render/2 is undefined or private
所以看来已经从路由器调用了SnakeController
,也已经调用了SnakeView
,但是出了点问题。
[更新]
我意识到在PhoenixFramework WebApp中使Phoenix LiveView
工作之前,我有很多事情要做:
端点endpoint.ex
。您需要添加
socket "/live", Phoenix.LiveView.Socket
路由器router.ex
。通过LiveView
向PageController
添加路由:
get "/snake", PageController, :snake
在PageController
中为snake
函数添加一个定义:
def snake(conn, _) do
conn
|> put_layout(:game)
|> LiveView.Controller.live_render(HelloWeb.SnakeLive, session: %{})
end
WebApp your_app_web.ex
。在view
中定义
import Phoenix.LiveView, only: [live_render: 2, live_render: 3]
configs.exs
中进行 Config。添加LiveView
盐令牌:
live_view: [
signing_salt: "YOUR_LIVEVIEW_TOKEN"
]
在您的live
Web应用程序文件夹中添加一个your_app_web
文件夹。将您的LiveView
视图放在此处。
在主app.js
文件中添加WebSocket连接:
import {LiveSocket, debug} from "phoenix_live_view"
let liveSocket = new LiveSocket("/live")
liveSocket.connect()
添加了CSS资源:live_view.css
,snake.css
,并在app.css
中导入了新的CSS:
@import "./phoenix.css";
@import "./live_view.css";
@import "./snake.css";
现在生成的WebApp结构应为:
├── assets
│ ├── css
│ │ ├── app.css
│ │ ├── live_view.css
│ │ ├── phoenix.css
│ │ └── snake.css
│ ├── js
│ │ ├── app.js
│ │ └── socket.js
├── config
│ ├── config.exs
├── lib
│ ├── hello
│ │ └── application.ex
│ ├── hello.ex
│ ├── hello_web
│ │ ├── channels
│ │ ├── controllers
│ │ ├── endpoint.ex
│ │ ├── gettext.ex
│ │ ├── live
│ │ ├── router.ex
│ │ ├── templates
│ │ └── views
│ └── hello_web.ex
在此阶段,将浏览器指向http://localhost:4000/snake时 我得到了LiveView的部分功能:
请检查完整代码here,以调查此问题。
答案 0 :(得分:1)
在页面底部-https://github.com/phoenixframework/phoenix_live_view-在您的代码中至少没有看到我要执行的步骤。
// assets/js/app.js
import LiveSocket from "phoenix_live_view"
let liveSocket = new LiveSocket("/live")
liveSocket.connect()
也许添加并确认您也涵盖了其余步骤。希望能奏效:)