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

How to run a `for <-`inside a `for <-`in a template

我正在尝试创建一个组件来构建可能具有嵌套子菜单的菜单:

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

只有一个 loop/level 这是有效的,但我尝试了几种不同的方法,但我无法使用这种方法来完成这项工作。 我可以做这个吗?

当您使用 . 函数时,您会经常看到这种情况(例如 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 来表示子菜单的结尾。根据您的用例,您可能希望使用递归数据结构(例如树)来表示您的菜单。