我有这个Go模板:
{{ if and $b.Trigger $b.Trigger.Name }}
Name is {{ $b.Trigger.Name }}.
{{ else }}
...other stuff...
{{ end }}
我正在尝试使用此模板:
if b.Trigger != nil && $b.Trigger.Name != "" { ...
但它不起作用,因为正如text/template godoc所说,评估和/或函数的两个参数。
当评估$b.Trigger.Name
时,它会出错,因为$b.Trigger
可能为零。所以它返回错误:
template: builds.html:24:46: executing "content" at <$b.Trigger.Name>: can't evaluate field Name in type *myType
我尝试重构这个:
{{ if and (ne $b.Trigger nil) (ne $b.Trigger.Name "") }}
奇怪的是,这也失败了,它说我无法将$ b.Trigger与nil进行比较,这没有意义,因为该字段是一个指针类型:
template: builds.html:24:31: executing "content" at <ne $b.Trigger nil>: error calling ne: invalid type for comparison
有任何想法吗?
正如沃尔克上面所说,嵌套ifs:
{{if $b.Trigger}}{{if $b.Trigger.Name}}
Name is {{ $b.Trigger.Name }}.
{{end}}{{end}}
或者,更简洁:
{{with $b.Trigger}}{{with .Name}}
Name is {{.}}.
{{end}}{{end}}
不幸的是,上述内容不会处理其他条款。这是一个(相当丑陋)的可能性:
{{$bTriggerName := ""}}
{{with $b.Trigger}}{{$bTriggerName = .Name}}{{end}}
{{with $bTriggerName}}
Name is {{.}}.
{{else}}
...other stuff...
{{end}}
我看看gobuffalo /毛绒是否可以更优雅地做到这一点,但截至2019-04-30它不能。
您可以尝试使用fet template engineer,然后您的代码将是这样的:
{%if !empty($b.trigger.name)%}
Name is {% $b.trigger.name %}
{%else%}
// other stuffs
{%/if%}