我来自Ruby
/PHP
后台,通常我使用直接从视图中提取模型而无需控制器,例如在erb
文件中:
<script>
var vm = {
rows: <%= ModelName.rows.to_json %>
};
// render vm.rows using client-side javascript
</script>
<div>
bla bla
</div>
是否可以像我在 erb 中所做的那样在Go
/Revel
的模板中提取模型?
我来自Ruby
/PHP
后台,通常我使用直接从视图中提取模型而无需控制器,例如在erb
文件中:
<script>
var vm = {
rows: <%= ModelName.rows.to_json %>
};
// render vm.rows using client-side javascript
</script>
<div>
bla bla
</div>
是否可以像我在 erb 中所做的那样在Go
/Revel
的模板中提取模型?
这种将代码直接嵌入模板的方法只能使用 Ruby 和 PHP 等解释性语言来完成。Go 模板包支持一些简单的指令(if、else、range 等 - 请参阅此处了解详细信息),但这种语法并不接近完整的脚本语言 - 这也可能不是有意的。您可以to_json
从模板调用方法,例如您的方法。但是(正如 twotwotwo 正确指出的那样)您甚至可能不需要额外的方法将数据转换为 JSON - 如果将其放在<script>
标签之间,Go 将自行进行转换。要自定义转换,请Marshaler
通过提供此处MarshalJSON
所述的方法来实现接口。
以下示例演示了在“脚本”上下文中直接输出结构并使用方法:
package main
import (
"html/template"
"log"
"os"
"strings"
)
type Greeter struct {
Repeat int
Salutation string
}
func (g Greeter) Perform() string {
return strings.Repeat(g.Salutation+" ", g.Repeat)
}
func main() {
sayHi := Greeter{Repeat: 3, Salutation: "Hi!"}
tmpl, err := template.New("").Parse("{{.}}\n<script>{{.}}</script>\n{{.Perform}}")
if err != nil {
log.Fatalf("Parse: %v", err)
}
tmpl.Execute(os.Stdout, sayHi)
}
http://play.golang.org/p/f3HShZfd6H
输出:
{3 Hi!}
<script>{"Repeat":3,"Salutation":"Hi!"}</script>
Hi! Hi! Hi!
Revel 构建在 Go 模板包之上,而不是实现自己的模板系统,因此上述内容也适用于 Revel。