如何与文本/模板进行短路和/或短路

问题描述 投票:3回答:2

我有这个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

有任何想法吗?

go go-templates
2个回答
0
投票

正如沃尔克上面所说,嵌套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它不能。


0
投票

您可以尝试使用fet template engineer,然后您的代码将是这样的:

{%if !empty($b.trigger.name)%}
   Name is {% $b.trigger.name %}
{%else%}
   // other stuffs
{%/if%}
© www.soinside.com 2019 - 2024. All rights reserved.