发布于2026-05-20 阅读(0)
扫一扫,手机访问

在 Beego 模板中使用 {{range}} 时,当前作用域会切换为迭代项(如 *models.Foo),导致 .user 等父级数据无法直接访问;需通过 $.user 显式引用根作用域变量。
在 Beego 模板中使用 `{{range}}` 时,当前作用域会切换为迭代项(如 `*models.Foo`),导致 `.user` 等父级数据无法直接访问;需通过 `$.user` 显式引用根作用域变量。
当你在控制器中向模板传递多个变量(如 c.Data["foos"] = foos 和 c.Data["user"] = user),模板根作用域(即 $)包含所有这些键值对。但一旦进入 {{range $foo := .foos}},. 就被重新绑定为当前迭代的 foo 实例(类型为 *models.Foo),此时 .user 不再存在——因此报错 user is not a field of struct type *models.Foo。
✅ 正确做法是:使用 $ 显式访问根作用域(即模板顶层数据上下文)。$ 始终指向最外层的 .Data 映射,因此 $.user 可安全访问原始 user 对象。
修正后的模板代码如下:
<tbody>
{{range $foo := .foos}}
<tr>
{{if $.user.IsSuperUser}}
<td>{{$.user.ID}}</td>
<td>{{$.user.Username}}</td>
<td>{{$.user.Email}}</td>
{{else}}
<td>{{$.user.Username}}</td>
{{end}}
<td>{{$.user.CreatedAt | date "2006-01-02"}}</td>
</tr>
{{end}}
</tbody>⚠️ 注意事项:
总结:{{range}} 会改变 . 的绑定对象,但 $ 始终稳定指向初始数据上下文——这是 Go 模板语言的标准机制,在 Beego、Hugo、Gin 等所有基于 html/template 的框架中均适用。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8