Elixir 真假切换

时间:2021-07-06 15:33:51

标签: elixir phoenix

我是 Elixir 的新手,正在尝试像 JS 一样在 truefalse 值之间切换,但我认为这是不可能的。有没有简单的方法来做到这一点?

组件

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>

谢谢大家

1 个答案:

答案 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

的值定义类