CherryPoppins

CherryPoppins

Let’s say I have the following in my liveview template:

my_template.html.leex
<div phx-hook="myHook">
  <div
    x-data="{inputvalue=''}"
    x-init="
      console.log('I AM INITING')
    "
  >
  <input x-model="inputValue">
  </div>
</div>
<script>
  document.addEventListener('alpine:init', () => console.log('INIT FROM SCRIPT TAG!'))
</script>

myHook.js
hooks.myHook = {
  mounted () {
    console.log('HOOK MOUNTED')
    document.addEventListener('alpine:init', () => console.log('INIT FROM HOOK'))
  }
}

My output is:

INIT FROM SCRIPT TAG
I AM INITING
I AM INITING
HOOK MOUNTED
I AM INITING
I AM INITING
  1. Why is the x-init running 4 times and how can I make it only run once?
  2. How can I get my hook to execute before x-init or the alpine:init event runs?

First 6 of 6 Posts Switch mode

ruslandoga

ruslandoga

I think x-init runs first when you get plain html response, then it runs again when liveview inits. Does it run 4 times without hook as well? If not, then I guess it might be forced to run after every hook event (mounted and updated in your case).

Also, how do you have alpine+liveivew set up?

CherryPoppins

CherryPoppins OP

My alpine setup (using “alpinejs”: “^3.2.3”):

import Alpine from 'alpinejs'

window.Alpine = Alpine
Alpine.start()

...

const liveSocket = new LiveSocket('/live', Socket, {
      params: {_csrf_token: csrfToken},
      dom: {
        onBeforeElUpdated(from, to) {
          if (from._x_dataStack) {
            window.Alpine.clone(from, to)
            window.Alpine.initTree(to)
          }
        },
      },
      hooks: Hooks,
    })
ruslandoga

ruslandoga

Try also removing Alpine.initTree. Having it called all the time might lead to problems, and it’s not always necessary. You can call it conditionally, like if from element has a data-init-tree attribute.

CherryPoppins

CherryPoppins OP

So, I removed the window.Alpine.initTree(to) line and now my output is:

INIT FROM SCRIPT TAG
I AM INITING
HOOK MOUNTED
I AM INITING
I AM INITING

That x-init is now running 3 times instead of 4. Also, with or without the hook, those last 2 init console.logs are still running.

ruslandoga

ruslandoga

Btw, I think x-data needs to be an object, not a code block, so try replacing x-data="{inputvalue=''}" with x-data="{inputvalue: ''}" and checking the results, maybe it affects something (maybe alpine thinks it’s Alpine.data component and executes it). Either way, I think you won’t be able to make x-init run once due to how liveview work, it would run at least twice. And regarding 2, try running Alpine.start() after liveview calls.

Also, try running without liveview connect, how many logs to do see in that case?

CherryPoppins

CherryPoppins OP

Sorry the x-data="{inputvalue=''}" was a typo, in my actual code I have it as you said, x-data="{inputvalue: ''}".

On the Alpine.start(), I thought about that but it seems kinda hacky, and I’m also not always sending a message back to the hook on liveview calls so wouldn’t necessarily be able to always call Alpine.start() after liveview calls without going out of my way to do so. It seems I’m not the only on experiencing this and Alpine apparently doesn’t think it is a bug since they moved this ticket to discussion. Would have been nice to have gotten an explanation when moved. I appreciate you trying to help me out @ruslandoga!

— All posts loaded —

Where Next? Top

Trending in Questions Top

stjefim
Hello! Suppose you are building workflow (order / task / payment) processing system with the following requirements: Each workflow con...
New
jonnycharles
I’m in search of an Elixir library that offers PDF generation capabilities similar to Ruby’s Prawn. While there have been discussions abo...
New
spammy
I’m looking to build a personal workflow to quickly deploy web applications written in elixir/phoenix, for local consumption (ie not on t...
New
dli
Before I dive in myself, did anyone successfully sprinkle Hologram into their existing LiveView app? Looking for hints regarding: Addi...
New
roeland
Kia ora, We have been using elixir-google-api to connect to Google Drive. However, with the updates to Tesla due to CVEs this is now bro...
New
bottlenecked
Hi all, I wanted to ask how the community is dealing with post-release steps. Today we have Ecto migrations, which make sure that the db...
New
rahultumpala
Hello, I have an Elixir backend that implements a custom protocol over TCP. I want to load test the backend and assess the performance o...
New

Other Trending Topics Top

JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
Damirados
Hello everyone. After busy few months I am happy to announce v0.1.0 of Emerge &amp; Solve. They are GUI (Emerge) and State management (S...
New
netoum
Corex is an accessible, unstyled UI component library for Phoenix that integrates Zag.js state machines using Vanilla JavaScript and Live...
New
ausimian
Emily is an Elixir library that runs Nx computations on Apple’s MLX. Install it as the default Nx backend and Nx, defn, Axon, Nx.Serving,...
New
juhalehtonen
There has been a thread to discuss the Stack Overflow Developer Survey on this forum every year since 2018, so here’s yet another one for...
New

We're in Beta

About us Mission Statement