JavaScriptを有効にしてください

【Elixir】サーバーから特定要素のイベントを実行する

 ·  ☕ 2 分で読めます

【Elixir】Phoenix 独自に定義したイベントを実行する方法

Elixir Phoenix でサーバーから特定の要素のイベントを実行する方法のメモ。

push_event と組み合わせて特定の要素に設定されたイベントを実行します。
Phoenix.LiveView.html#push_event/3

たとえばダイアログを出して入力後にダイアログを閉じたいとかの時に使用できます。

確認環境

  • Elixir 1.14.2
  • Phoenix 1.6.3

テンプレート

まずは簡単にテンプレート側を書いてみます。

1
2
3
4
5
<button id="show" phx-click={JS.show(to: "#sample")} type="button">表示</button>
<button id="hidden" phx-click={JS.hide(to: "#sample")} type="button">非表示</button>
<div id="sample">
    <button phx-click="event" type="button">非表示</button>
</div>

イベントハンドラー

liveview側を書きます。

イベントハンドラーの実行部分だけになります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
  @impl true
  def handle_event("event", _params, socket) do
    {
      :noreply,
      socket
      |> put_flash(:info, "閉じる!")
      |> push_event("js-exec", %{
        # イベントを実行する対象(クエリセレクタ)
        to: "#hidden",
        # イベントを実行する要素名
        attr: "phx-click"
      })
    }
  end

JavaScriptにイベントを追加

app.js に以下のイベントリスナーを追加。

1
2
3
4
5
6
7
8
// 特定のイベントを実行する
window.addEventListener("phx:js-exec", ({detail}) => {
  // クエリセレクター
  document.querySelectorAll(detail.to).forEach(el => {
      // 要素のイベントを実行
      liveSocket.execJS(el, el.getAttribute(detail.attr))
  })
})

参考

共有

こぴぺたん
著者
こぴぺたん
Copy & Paste Engineer