我是 Elixir 的新手,正在尝试像 JS 一样在 true
和 false
值之间切换,但我认为这是不可能的。有没有简单的方法来做到这一点?
在组件
def update(assigns, socket) do
socket
|> assign(:show_password, false)
|> reply(:ok)
end
def handle_event("show_password", _params, socket) do
socket
|> assign(:show_password, !:show_password)
|> reply(:noreply)
end
在HTML
<i class="icon-closed_eye" phx-click="show_password" phx-target="<%= @myself %>"></i>
谢谢大家
答案 0 :(得分:1)
确实如此,但是,正如评论中提到的,:show_password
是一个原子,而不是一个布尔值,因此 !:show_password
没有多大意义。但是,您已经在套接字的 :show_password
中拥有 :assigns
的值。所以你可以更新它:
def handle_event("show_password", _params, socket) do
socket
|> assign(:show_password, !socket.assigns[:show_password])
|> reply(:noreply)
end
甚至:
def handle_event("show_password", _params, socket) do
socket
|> update(:show_password, &(!&1))
|> reply(:noreply)
end
然而,对于模板,您仍然需要使用类似条件的东西:
<%= if @show_password do %>
<i class="icon-closed_eye" phx-click="show_password" phx-target="<%= @myself %>"></i>
<% else %>
<i class="icon-opened_eye" phx-click="show_password" phx-target="<%= @myself %>"></i>
<% end %>
假设您还有一个 icon-opened_eye
图标。
从那里您可以找到其他改进。例如,您可以避免使用条件并使用辅助函数来根据 @show_password