elixir - 在 Phoenix Elixir 中调用带有渲染的视图
问题描述
在我的Phoenix/Elixir 样板 Web 应用程序中,我具有此处描述的典型结构,其中简单HelloController
使用 HelloView 组件来呈现hello/
文件夹中的模板。这工作正常。现在假设我想在此处snake_view.ex
添加View 组件。这个 View 依赖于LiveView并且与渲染模板的其他普通视图略有不同,因为它在其他功能中包含一个方法:Phoenix
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
,但是出了点问题。
[更新]
我已经意识到,在使LiveView
PhoenixFramework WebApp 中的 Phoenix 运行之前,我还有很多事情要做:
端点
endpoint.ex
。您需要添加一个socket "/live", Phoenix.LiveView.Socket
路由器
router.ex
。添加到LiveView
via 的路由PageController
:get "/snake", PageController, :snake
在
PageController
为函数添加 def 中snake
:def snake(conn, _) do conn |> put_layout(:game) |> LiveView.Controller.live_render(HelloWeb.SnakeLive, session: %{}) end
网络应用程序
your_app_web.ex
。添加view
定义import Phoenix.LiveView, only: [live_render: 2, live_render: 3]
配置在
configs.exs
. 添加LiveView
盐令牌:live_view: [ signing_salt: "YOUR_LIVEVIEW_TOKEN" ]
live
在您的your_app_web
Web 应用程序文件夹中添加一个文件夹。把你的LiveView
观点放在那里。在主
app.js
文件中添加 WebSocket 连接:import {LiveSocket, debug} from "phoenix_live_view" let liveSocket = new LiveSocket("/live") liveSocket.connect()
添加了 css 资源:
live_view.css
, , 在新 csssnake.css
中导入:app.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 部分工作:
请在此处查看完整代码以调查此问题。
解决方案
在此页面的底部 - https://github.com/phoenixframework/phoenix_live_view - 至少有一个步骤我在您的代码中没有看到。
// assets/js/app.js
import LiveSocket from "phoenix_live_view"
let liveSocket = new LiveSocket("/live")
liveSocket.connect()
也许添加它并确认您已经涵盖了其余步骤。希望这有效:)
推荐阅读
- laravel - 我如何在 laravel 项目中使用访问令牌
- java - 如何使用 okHttpClient 执行 graphql 查询?
- java - Spring Boot + JPA (Hibernate) - 如何使用 OneToMany 双向映射删除嵌套实体
- javascript - 如果响应在模态中出错,则 ReactJS 引导警报
- python - 从 Json python 中提取复杂的日期
- java - Base64 解码差异
- r - ggplot2 facet_grid:如何修复 geom_col 中列之间的不同间距
- python - 如何根据多个索引和多个条件过滤一行?
- spring - Сamunda 替换测试中外部任务的行为
- python - 不兼容和旧的 pip 包。许多操作在 Flow Project 中无法稳定运行