axelson
54) ElixirConf US 2018 – Closing Keynote – Chris McCord
ElixirConf US 2018 – Closing Keynote – Chris McCord (@chrismccord)
All talks thread:
Most Liked
grych
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
I really hope @chrismccord works with you on LiveView. You’ve definitely pioneered and popularized this entire concept within this community.
grych
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
ampereswith 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)
Last Post!
tmbb
I bet you can compile
<%= form_for changeset, ..., fn f -> %>
# code that uses f
<% end %>
into
<form ...>
# static stuff
<% very_higyenic_var = FormData.to_form(changeset) %>
# code is transformed so that f becomes very_hygienic_var
# the variable leaks but because it's hygienic it will have no effect on the global scope
# (it's never used anywhere)
</form>
In the case of a form, it would be useful to reuse the csrf token and mark it as static, but that’s really easy to handle. We just need to tag it with something like {:static, expr} and move the expr into the static part of the template. That way it will only be rendered once and can be reused.
EDIT: just because we can it doesn’t mean we should, but it’s an avenue worth pursuing, and even if we fail it’s worth finding out why and documenting it, so that others won’t have to discover it by
EDIT2: for even more safety, the “hygienic variable” could have the name of the function argument (in this case f) with a different context so that if anything depends on the variable name things will still work. Of course it’s never hoing to be 100% referentiay transparent but it’s pretty close.
Popular in Talks
Other popular topics
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
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #hex
- #security









