如何在模板中运行`for< -`inside a` for< -`

时间:2016-04-09 14:14:16

标签: elixir phoenix-framework

我试图创建一个构建可能有嵌套子菜单的菜单的组件:

Product A
Product B ------ Product B1
Product C        Product B2
                 Product B3

在我的组件中,我有这个(简化了部分删除)代码:

<%= for {link_subMenuLinkNumber, id} <- Enum.with_index(@link_subMenuLinkNumber) do %>
    <a class="comp link" href="<%= link_subMenuLinkNumber.link %>"><%= link_subMenuLinkNumber.text %></a>
                               <%= if link_subMenuLinkNumber.subMenu do %>
         <%= for {link_subMenuLinkNumber.subMenu, id} <- Enum.with_index(@link_subMenuLinkNumber.subMenu) do %>
               <a class="comp link secondLayer subMenu ite" href="<%= link_subMenuLinkNumber.subMenu.linkSubMenu %>"><%= link_subMenuLinkNumber.subMenu.textSubMenu %></a>
         <% end %>
                               <% end %>
<% end %>

在我插入此组件的模板中,我有这个(简化了部分删除)代码:

link_subMenuLinkNumber: [
                          %{link: "/prod1", text: "LOLOL1", subMenu: nil},
                          %{link: "/prod2", text: "LOLOL2", subMenu: [
                                       %{textSubMenu: "KAKAka", linkSubMenu: "/subProdKA"},
                                       %{textSubMenu: "ZaZaza", linkSubMenu: "/subProdZA"}
                                                                     ]},
                          %{link: "/prod3", text: "LOLOL3", subMenu: nil}
                         ]

我收到此错误:

...cannot invoke remote function link_subMenuLinkNumber.subMenu/0 inside match

只有一个循环/级别,这是有效的,但我尝试了一些不同的方法,我无法使用这种方法使这项工作。 我可以做这个工作吗?

1 个答案:

答案 0 :(得分:2)

当您使用.功能(例如link_subMenuLinkNumber.subMenu

)时,您会看到这种情况

您可以通过以下方式更轻松地看到这一点:

iex> %{foo: "foo"}.foo = "foo"
** (CompileError) iex:2: cannot invoke remote function %{foo: "foo"}.foo/0 inside match

在您的情况下,您有:

<%= for {link_subMenuLinkNumber.subMenu, id} <- Enum.with_index(@link_subMenuLinkNumber.subMenu) do %>

不要忘记,在这里你要分配一个值,你不能为link_subMenuLinkNnuber.subMenu.赋值。相反,我认为你想要:

<%= for {sub_menu, id} <- Enum.with_index(link_subMenuLinkNumber.subMenu) do %>

要阻止if检查,您还可以更改数据结构,以使用空列表([])代替nil来表示子菜单的结尾。根据您的使用情况,您可能希望使用递归数据结构(例如树)来表示菜单。