axelson

axelson

Scenic Core Team

54) ElixirConf US 2018 – Closing Keynote – Chris McCord

ElixirConf US 2018 – Closing Keynote – Chris McCord (@chrismccord)

All talks thread:

Most Liked Responses

grych

grych

Creator of Drab

This is true, actually Drab is quite mature, because it’s been born in the long discussions in this forum.

  • small reads and updates of DOM (Drab.Element, Drab.Query)
  • quick access to the browser-specific attributes, like a local timezone (Drab.Browser)
  • Drab.Modal, which is IMO a killer feature as it actually hold on processing and waits for the user input
  • Drab.Waiter, which does the same but more general, without a modal
  • and, last but not least, ability to calculate using browser (exec_js(socket, "2+2"))

So after reconsideration I am going to move Drab to the v1.0, as it is just a few steps ahead, and a lot of code for this is already done. I hate wasting good code. The project will be supported (bug fixes) as long as people are using it, but no new big features will be developed by now (sorry @OvermindDL1, no token via cookie, as I want to wait to see how Chris will cover this, but we may think about building our own transport as it would be easier since phx1.4).

Then I will take a break and will see what will born as a LiveView. If, as I assume, it will be a huge success, I will give up Drab.Live and Commanders and adopt rest of the Drab features to the LiveView, using its event handler API (phx-click attributes). Which accually I like more than mine, I probably overcomplicated stuff with Commanders, but have some concerns if it can cover some cases.

brightball

brightball

I really hope @chrismccord works with you on LiveView. You’ve definitely pioneered and popularized this entire concept within this community.

grych

grych

Creator of Drab

I don’t know if it is helpful, but this is how Drab does it. In compile time:

  • it has its own EEx engine
  • during compilation the Drab EEx, while handle_expr, it is checking if there are any assigns inside the expression
  • if there are assigns, it is injecting the special attribute (drab-ampere), to the parent tag; if there is no parent tag, it is surrounding the expression with the <span>
  • injecting the attribute also checks if the assign is in the tag body, or in the attribute
  • there is a special mark, <%/ %> which marks expressions which should not be ‘drabbed’
  • at the end, it collects all amperes with the corresponding assigns; this is how it knows where to change if you update the assign in a runtime
  • assigns are stored in the frontend, Drab injects javascripts like window.__drab.assigns.myassigns = <%= @myassign%> to the template

In a runtime:

  • you render the template as usual, with the controller
  • on connect, Drab gets the current assign values from the frontend and cache it in the genserver
  • on any assigns change (called poke), Drab re-renders the template on the backend; because it know exactly where in the template the assign you are changing is begin used, it gets the value of the tag body (or the attribute value) with Floki
  • then it sends the JS back to the browser - it is a simple update of the specific tags only
  • it also sends back the new assign value to the browser - this is important, because in case of disconnect the Drab genserver is killed

There are also corner cases, like a special treatment for @conn, or keeping the csrf token in case you update the whole form, or detecting which ampere to update in case they are nested.

All the above looks complicated, but this was the only what I could invent with the assumptions that:

  • you do not require many changes to the existing phoenix project: in this case the only change is the extension from *.eex to *drab
  • it must be beginner friendly (to convince beginners who are scared of Ajax and JS)
  • it must work as expected, be intuitive (this is why assign values must survive disconnection)
  • all must be archived with external library only, without any changes to Phoenix (as they are not very welcomed)

Where Next?

Popular in Talks Top

axelson
ElixirConf 2017 - Dr. Erlang/OTP or: How I Learned to Stop Worrying and Love :disk_log - Eric Entin Even aft...
New
axelson
ElixirConf 2017 - Keep an Eye on the Sky with Nerves and Phoenix - @electricshaman As part of the next gener...
New
blatyo
Looks like videos have started to go up for ElixirConf US 2018. Here’s the playlist of ones available so far. I expect it’ll get updated ...
New
New
AstonJ
Announced in February 2019, Broadway is a new open source tool developed by Plataformatec that aims to streamline data processing pipelin...
New
axelson
I really like the idea of discussing one Elixirconf talk each day and since @brightball hasn’t posted the second talk I’ll post it. Elix...
New
axelson
ElixirConf US 2018 – Texas: Virtual DOM Library for Server-Side V-DOM. – Dan McGuire (@dgmcguire) Client-si...
New
CodeSync
Code Sync: Keynote: The Road To LiveView 1.0 by Chris McCord | ElixirConf EU 2023 Comments welcome! View the <span class="hashtag-icon-p...
New
axelson
ElixirConf US 2018 – We’re Just Getting Started - Our Three Years with Elixir – Maciej Kaszubowski (@mkaszubowski) ...
New
axelson
ElixirConf US 2018 – Beyond Command and Response Chatbot – Fahad Almusharraf The talk discusses an attempt ...
New

Other popular topics Top

TunkShif
This post is an instruction guide to help you setup your Neovim for Elixir development from scratch. It includes general information on h...
274 41539 114
New
mcarvalho
What is the difference between System.get_env and Application.get_env? For example, what are best practices to use one versus another.
New
greenz1
I have a phoenix application from which a user can download multiple(5-6) files of size 1MB. I couldn’t find anything related to sending ...
New
Fl4m3Ph03n1x
About me? ( if you have nothing better to do than reading about some random guy in the internet :stuck_out_tongue: ) Hello all, this is ...
New
dokuzbir
I want to highlight html closing tags when i click a html tag. That works in .html files but doesnt work for html.eex templates. How can...
New
aesmail
Hello guys, I have finally made it. I created an admin interface for a framework. It’s been on my todo list for years and with the curre...
New
grych
Hi folks, Few months ago I have announced the proof-of-concept of the library to manipulate the browsers DOM objects directly from Elixi...
639 52341 488
New
rms.mrcs
Hi, I need to transform a list of numbers into a map where the keys are the indexes and the values are the original values of the list. ...
New
jononomo
For some reason my phoenix channels are working for me in my local dev environment, but as soon as I deploy via Docker, I get a 403 error...
New
lanycrost
Hi everyone! I need implement if…else if…else condition from my elixir code, and anymore of this control flow structures not work proper...
New

We're in Beta

About us Mission Statement