axelclark

axelclark

Drab: Using a Shared Commander and Living Assigns

I’m working on a golf scorecard app. I’d like to be able to quickly update the number of strokes using Drab. I’m displaying the scores for each round in a table then rendering each score in a partial for that row.

show.html.eex

<h2>Scorecard</h2>

<table>
  <thead>
    <tr>
      <th>Hole Number</th>
      <th>Par</th>
      <th>Add</th>
      <th>Strokes</th>
    </tr>
  </thead>
  <tbody>
    <%= for score <- @round.scores do %>
      <%= render "score_rows.html", Map.put(assigns, :score, score) %>
    <% end %>
  </tbody>
</table>

score_rows.html.drab

<tr drab-commander="GolfWeb.RoundCommander">
  <td>
    <%= @score.hole.hole_number %>
  </td>
  <td>
    <%= @score.hole.par %>
  </td>
  <td>
    <button drab="click:add({id: <%= @score.id %>, num_strokes: <%= @score.num_strokes %>})">+</button>
  </td>
  <td>
    <%= @score.num_strokes %>
  </td>
</tr>

Eventually I will update the database, but I’m just trying to get it wired up for now. Here is my commander.
round_commander.ex

defmodule GolfWeb.RoundCommander do
  use Drab.Commander

  defhandler add(socket, sender, %{"id" => id, "num_strokes" => num_strokes}) do
    score = %{id: id, num_strokes: add_stroke(num_strokes), hole: %{par: 4, hole_number: 2}}
    poke socket, "score_rows.html", score: score
  end

  defp add_stroke(nil), do: 1
  defp add_stroke(num_strokes), do: (num_strokes + 1)
end

When I click the add button, all of the scores in the table are updated rather than just the score within the row.

In the Drab Examples section titled “Shared Commanders and Living Assigns”, it looks like only the partials within each drab-commander should be updated. I checked the rendered html and each partial has a different drab-id.

I also found the Shared Commanders section in the Drab docs and couldn’t find anything I needed to change.

Is what I’m trying to do possible or any ideas about what I’m doing wrong? Thanks!

Marked As Solved

axelclark

axelclark

I was able to get the basic functionality working using set_prop instead of poke:

score_rows.html.drab

<tr drab-commander="GolfWeb.RoundCommander">
  <td>
    <%= @score.hole.hole_number %>
  </td>
  <td>
    <%= @score.hole.par %>
  </td>
  <td>
    <button drab="click:add({id: <%= @score.id %>})">+</button>
  </td>
  <td class="num_strokes">
    <%= @score.num_strokes %>
  </td>
</tr>

RoundCommander.ex

  defhandler add(socket, sender, _params) do
    # hard code "4" for testing
    set_prop socket, this_commander(sender) <> " .num_strokes", innerHTML: "4"
  end

This updates only the score next to the button.

Also Liked

grych

grych

Creator of Drab

Well, it should be like this, otherwise it is counter-intuitive. I did not test this behaviour under the partial, but I will. Thanks for this!

Last Post!

grych

grych

Creator of Drab

Well, it should be like this, otherwise it is counter-intuitive. I did not test this behaviour under the partial, but I will. Thanks for this!

Where Next?

Popular in Questions Top

vonH
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
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
Darmani72
If I have a post route which an argument: post /my_post_route/:my_param1, MyController.my_post_handler How would get the post params ...
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
jerry
Good day to you all. I have been struggling to get a query involving like and ilike to work. Can anyone assist me on this, please? pro...
New
shijith.k
I am trying to start a new phoenix project with elixir 1.9, but mix phx.new does not work. It says that ** (Mix) The task "phx.new" could...
New
siddhant3030
Hi, I have to write a raw query for one of my project. But till now I have used ecto queries and don’t have much experience writing raw ...
New

Other popular topics Top

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
baxterw3b
Hi guys, i’m new in the Elixir world, and i have to say, that i love it! i’m having some problem to understand anonymous functions with ...
New
nsuchy
Hi. I’ve noticed that Windows Powershell has it’s own IEX command and you cannot access Elixir’s IEX due to the conflict. This isn’t a cr...
New
dogweather
I wrote this comment on r/haskell, and it’s not popular there. :wink: But I think I’m on to something… Haskell reminds me of Java, and e...
New
sen
Hi All, I set a environment variables in dev.exs , like below code. when i start server, how can i set the ${enable} value? thanks. d...
New
msaraiva
Surface is an experimental library built on top of Phoenix LiveView and its new LiveComponent API that aims to provide a more declarative...
564 44139 214
New

We're in Beta

About us Mission Statement