Elixir EEx:在循环遍历地图或集合时确定当前迭代

时间:2017-05-16 22:39:48

标签: elixir phoenix-framework

我们以此模板位为例:

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

在各种框架中,您可以检查当前索引/迭代/如果在模板代码中循环收集时第一个(或最后一个),Elixir / Phoenix是否提供任何类似的功能?作为一个例子,让我们说如果我们在第一次迭代中渲染一个特定的模板文件,然后为所有其他迭代渲染一个不同的模板文件,那么是否有最佳效果实现这个的实践?

我考虑过设置一个变量来跟踪当前的迭代,但它似乎并不像Erlang中的变量的不可变性使得这种可能性甚至是可取的。

2 个答案:

答案 0 :(得分:5)

Enum.with_index效果很好

<%= 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 %>

修改

更符合原始代码...

<%= 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 :(得分:0)

@thread对我有用

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