2017-05-16 1 views
1

Nehmen sich diese Vorlage Bit als Beispiel:Elixir EEx: Determinig aktuelle Iteration, während sie durch Karten oder Sammlungen Looping

<%= if (length thread.posts) > 0 do %> 
    <%= for post <- thread.posts do %> 
     <%= for post <- thread.posts do %> 
      <%= render "post.html", post: post %> 
     <%= end %> 
    <% end %> 
<%= end %> 

In verschiedenen Frameworks Sie in der Lage sind, die aktuelle Index/Iteration/wenn zuerst zu überprüfen (oder last) beim Durchschleifen von Sammlungen im Template-Code, stellt Elixir/Phoenix ähnliche Funktionen zur Verfügung? Nehmen wir zum Beispiel an, wir möchten eine bestimmte Vorlagendatei rendern, wenn wir in der ersten Iteration sind, und dann eine andere Vorlagendatei für alle anderen Iterationen rendern. Gibt es dafür eine Best Practice?

Ich habe überlegt, eine Variable zu setzen, um die aktuelle Iteration zu verfolgen, aber es scheint nicht wie die unveränderliche Natur der Variablen in Erlang macht es möglich oder sogar wünschenswert.

Antwort

4

Enum.with_index funktioniert gut

<%= if (length thread.posts) > 0 do %> 
    <%= thread.posts |> Enun.with_index |> Enum.map(fn {post, inx} -> %> 
     <%= for post <- thread.posts do %> 
      <%= render "post.html", post: post %> 
     <%= end %> 
    <% end) %> 
<%= end %> 

EDIT

Um mehr im Einklang mit dem Original-Code ...

<%= if (length thread.posts) > 0 do %> 
    <%= for {post, inx} <- Enum.with_index(thread.posts) do %> 
     <%= for post <- thread.posts do %> 
      <%= render "post.html", post: post %> 
     <%= end %> 
    <% end %> 
<%= end %> 
+1

Dank! 'Enum.with_index' funktioniert in meinem Fall perfekt. – nitomoe