【发布时间】:2019-08-27 18:40:45
【问题描述】:
在my Phoenix/Elixir 样板网络应用程序中,我具有描述here 的典型结构,其中简单的HelloController 使用HelloView 组件来呈现hello/ 文件夹中的模板。这工作正常。
现在假设我要添加snake_view.ex View 组件here。这个 View 依赖于 Phoenix LiveView 并且与渲染模板的其他普通视图略有不同,因为它在其他函数中包含 render 方法:
defmodule HelloWeb.SnakeView do
use Phoenix.LiveView
# ..
def render(%{game_state: :over} = assigns) do
# ..
现在,在添加了LiveView 依赖之后,我在router.ex 中添加了一个路由
get "/snake", SnakeController, :index
但现在我不知道如何从这个新的SnakeController 中引用SnakeView:
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,但是出了点问题。
[更新]
我意识到,在使 PhoenixLiveView 在 PhoenixFramework WebApp 中运行之前,我还有很多事情要做:
-
端点
endpoint.ex。您需要添加一个socket "/live", Phoenix.LiveView.Socket -
路由器
router.ex。通过PageController添加到LiveView的路由:get "/snake", PageController, :snake -
在
PageController中为snake函数添加一个def:def snake(conn, _) do conn |> put_layout(:game) |> LiveView.Controller.live_render(HelloWeb.SnakeLive, session: %{}) end -
Web 应用程序
your_app_web.ex。添加viewdefimport Phoenix.LiveView, only: [live_render: 2, live_render: 3] -
在
configs.exs中配置。添加LiveView盐令牌:live_view: [ signing_salt: "YOUR_LIVEVIEW_TOKEN" ] 在您的
your_app_webWeb 应用文件夹中添加一个live文件夹。将您的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 以调查此问题。
【问题讨论】:
-
render/2-> 2 个参数 -
@m3characters 谢谢我已经清理了示例,并修复了大部分问题,但它仍然不能完全工作。请参阅 github 存储库。