在我的模板(html.eex文件)中,我试图使用关键字列表来传递选项。我有:
<%= if :layer1 in @buttonCSS do %><%= @buttonCSS[:layer1] %><% end %>然后,我传递这样的值,在其中我使用模板:
<%= render MyProject.ComponentView, "button.html",
buttonCSS: [layer1: "font-style: italic;"]
%>如果我不使用if条件,这是可行的。那么,in不应该在这里工作吗?
我尝试过只使用layer1而不是:layer1,但后来出现了一个错误。
PS:还有,为什么使用.layer1而不是[:layer1]不起作用?
发布于 2016-06-15 09:20:09
由于关键字列表只是列表,in实际上检查列表中是否存在整个键/值对:
iex(1)> :a in [a: 1]
false
iex(2)> {:a, 1} in [a: 1]
true您应该检查@buttonCSS[:layer1]是否真实,因为一个不存在的键将返回nil,这是错误的:
<%= if @buttonCSS[:layer1] do %>
<%= @buttonCSS[:layer1] %>
<% end %>如果实际上只是在if中打印值,则可以跳过if并直接打印值,因为打印nil不会打印任何内容:
<%= @buttonCSS[:layer1] %>演示:
iex(1)> EEx.eval_string "<%= @buttonCSS[:layer1] %>", assigns: [buttonCSS: [layer1: "foo"]]
"foo"
iex(2)> EEx.eval_string "<%= @buttonCSS[:layer1] %>", assigns: [buttonCSS: []]
""PS:还有,为什么使用
.layer1而不是[:layer1]不起作用?
点语法只适用于Maps (以及模块中的函数),而不适用于关键字列表。如果你有:
buttonCSS: %{layer1: "font-style: italic;"}但是请注意,点语法与[]不完全相同:如果一个键不存在,它会抛出一个错误,而不是返回nil。
发布于 2016-06-15 09:19:35
在查找可枚举元素时,应该使用in/2 (使用遮罩下的成员?/2 )。
iex> :foo in [:foo]
true
iex> :foo in [foo: :bar]
false但是,这将有效,因为如果没有设置@buttonCSS[:layer1],它将返回零。
<%= @buttonCSS[:layer1] %>https://stackoverflow.com/questions/37831168
复制相似问题