在 Elixir 中切换 true 和 false

toggle between true and false in Elixir

我是 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>

谢谢大家

当然是,但是,正如评论中提到的,:show_password 是一个原子,而不是布尔值,因此 !:show_password 没有多大意义。但是,您在套接字的 :assigns 中已经有了 :show_password 的值。所以你可以更新它:

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

的值定义 class