Unfortunately, it is not a bug. This is a limitation of Drab.Live’s local variables scope && the way how Drab is replacing parts of the page with the evaluated expression with new assign values.
When you’re poking
the new version of assign @page_id
, Drab tries to update it in every expression on a page, which contains that value. In this case, it is if page.id == @page_id, do:...
. But in the particular moment it does not know the value of page
variable - that’s why it shows undefined function page() while evaluating this expression.
It is done by purpose. I could search expressions for assigns in their do..end
blocks, and re-render the the whole for
comprehension while changing @page_id
. And actually it was made like this before, but I realized that in the real world it provides to full reload of almost the whole page and more issues, like #42.
In this particular situation, when you poke @page_id
, you really want to update the whole for
compehension. One of the solution would be to put @page_id
assign in the comprehension filter:
<%= for page <- @holder.pages, page.id == @page_id do %>
<tr>
<td><%= page.title %></td>
</tr>
<% end %>
This moves @page_id
to the for
expression, and now, after you poke
it, it re-evaluates the whole one.
I know it is not very intuitive, but so far I couldn’t find the better solution.
Anyway, please create an issue on github, this situation needs more explanation/docs and/or at least the better error description. Probably it should not even compile.
Docs: https://hexdocs.pm/drab/Drab.Live.EExEngine.html#module-limitations