fceruti
In a nutshell the issue I’m facing is that every time I register alpine’s @ or x-on event handler, two are registered and called when the action is performed.
The issue is solved if I comment liveSocket.connect(), which leads me to believe the problem is in the interoperation of liveSocket and Alpine.
I’ve circled the internet without success. Has anyone had this issue and solved it?
Packages:
Phoenix: 1.6.2
Phoenix Live View: 0.16.4
Surface: 0.6.1
Alpinejs: 3.3.5 & 3.4.2
Surface component:
defmodule TimetaskApp.WeekCalendar do
use Surface.LiveComponent
prop hours, :list, required: true
prop dates, :list, required: true
@impl true
def render(assigns) do
~F"""
<div class="w-full h-full flex flex-col" style="height: calc(100vh - 100px)" id="week-calendar"> {!-- Calendar --}
<div class="h-full flex-1 flex flex-row relative">
<div
class="flex-1 flex"
id="week-calendar-columns"
:hook="WeekCalendar"
x-init="fromHour = +$el.dataset.fromHour; toHour = +$el.dataset.toHour;"
x-data="week_calendar_data"
data-from-hour={List.first(@hours)}
data-to-hour={List.last(@hours)}
>
<div
class="flex-1 flex"
id="week-calendar-days-container"
x-ref="days_container"
>
{#for date <- @dates}
<div
id={"day_col_#{format_date(date)}"}
data-date={format_date(date)}
class="flex-1 border-r border-tt-border-calendar relative"
@mousedown.stop="startNewTimebox($event, $el.dataset.date)"
>
</div>
{/for}
</div>
</div>
</div>
</div>
"""
end
end
app.js:
import { Socket } from "phoenix"
import { LiveSocket } from "phoenix_live_view"
import topbar from "topbar"
import Alpine from "alpinejs"
import Hooks from "./_hooks"
import "./app/week_calendar.js"
window.Alpine = Alpine
Alpine.start()
let csrfToken = document.querySelector("meta[name='csrf-token']").getAttribute("content")
let liveSocket = new LiveSocket("/live", Socket, {
params: { _csrf_token: csrfToken },
hooks: Hooks,
dom: {
onBeforeElUpdated(from, to) {
if (from._x_dataStack) {
window.Alpine.clone(from, to)
}
},
},
});
topbar.config({ barColors: { 0: "#03ad8c" }, shadowColor: "rgba(0, 0, 0, .3)" })
window.addEventListener("phx:page-loading-start", info => topbar.show())
window.addEventListener("phx:page-loading-stop", info => topbar.hide())
liveSocket.connect()
window.liveSocket = liveSocket
./app/week_calendar.js
document.addEventListener("alpine:init", () => {
Alpine.data("week_calendar_data", () => ({
fromHour: 0,
toHour: 0,
newTimebox: null,
startNewTimebox(event, date) {
const fromTime = this.getTimeFromEvent(event)
this.newTimebox = {
date: date,
fromTime: fromTime,
toTime: null
}
console.log(`Start new timebox ${date} ${fromTime.hour}:${fromTime.minute}`)
},
}))
});
Chrome dev tools:
Chrome console:
![]()
Trending in Questions
Hello!
Suppose you are building workflow (order / task / payment) processing system with the following requirements:
Each workflow con...
New
Hey guys,
I’ve got a huge CSV ( around 10 GB ) that needs to be processed hourly
Do you guys have any suggestions what is the best prac...
New
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
Hello!
Could someone please give me a help/sample code, how to delete a file from s3 using waffle/waffle_ecto from Phoenix app.
I creat...
New
I have what I’ve heard referred to as a “lookup table” in my database. This is a way of assigning codes to common values. One common lo...
New
Hello,
I’m developing a online persistent chat system (what’s app) like using elixir/dynamodb/aws for a mobile app(flutter).
The diffic...
New
What approach to take when sending live updates to “random” users Hi! I have a question, I have a little chat app, and when I create a DM...
New
Other Trending Topics
Hobbes is a low-level distributed database for the Elixir programming language.
Hobbes provides a simple, safe, and scalable storage lay...
New
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
ExRatatui lets you cook up rich terminal UIs in Elixir, powered by Rust’s ratatui via Rustler NIFs. Build interactive terminal applicatio...
New
Hello everyone. After busy few months I am happy to announce v0.1.0 of Emerge & Solve.
They are GUI (Emerge) and State management (S...
New
Corex is an accessible, unstyled UI component library for Phoenix that integrates Zag.js state machines using Vanilla JavaScript and Live...
New
There are three potential reasons for members of this forum to have a look at https://vutuv.de
You are tired or annoyed of LinkedIn.
Yo...
New
Latest Phoenix Threads
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #elixirconf
- #channels
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #blog-post
- #ai
- #phoenix_html
- #elixirconf-us
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #hex
- #security
- #metaprogramming











Showing Posts 1 to 10- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
seanc
Does it work if you get rid of
Alpine.start()? Importing might automatically start it.fceruti
Nothing happens, the event handlers are not present. Alpine is not started in the import.
cmo
You got an
x-dataon that div, or its parent?fceruti
Yes there is, I updated my original post to show more context.
cmo
what’s the rendered html look like for the bit inside
{#for date <- @dates}?fceruti
This is the page full html (ps: I made a few updates to the original post)
view-source:127.0.0.1:4000/app/calendar
What you are asking is inside the element with id
week-calendar-days-containercmo
Probably doesn’t matter but you have a random
"in the divs with the IDs<div id="day_col_2021-11-09"?I’ve had to use alpines
templatetag (wrapped in aRawtag - I use surface) for somewhere where I generated a list of things which had myriad alpine bindings. Unfortunately, I’ve stepped away from the computer for the day so I can’t show you an example.fceruti
By any chance are you back yet? I’m stilll having this issue
cmo
Here is a cut down version. Note that I’m using Surface, hence the
<#Raw>tags (I assume there is a parallel in plain old liveview) and different syntax. The hook reads attributes from the hiddenspans and sends them to Apline. Alpine creates the html for the options. I had a bit of trouble getting this to work and when it worked I stopped touching it and moved on. I hope to revist if/when I get some timeHook:
fceruti
Me too!