Go 直接从Revel模板引擎中提取模型

Go 直接从Revel模板引擎中提取模型,go,template-engine,revel,Go,Template Engine,Revel,我来自Ruby/PHP背景,通常使用不带控制器直接从视图中拉出模型,例如在erb文件中: <script> var vm = { rows: <%= ModelName.rows.to_json %> }; // render vm.rows using client-side javascript </script> <div> bla bla </div> var vm={ 排: }; //使用客户端j

我来自
Ruby
/
PHP
背景,通常使用不带控制器直接从视图中拉出模型,例如在
erb
文件中:

<script>
  var vm = {
    rows: <%= ModelName.rows.to_json %>
  };
  // render vm.rows using client-side javascript
</script>
<div> 
  bla bla
</div>

var vm={
排:
};
//使用客户端javascript呈现vm.rows
布拉布拉

是否可以像我在erb中所做的那样,在
Go
/
Revel
的模板中拉取模型?

这种直接将代码嵌入模板的方法只能用解释语言(如Ruby和PHP)来完成。Go模板包支持一些简单的指令(if、else、range等-请参阅以了解详细信息),但这种语法与完整的脚本语言并不接近-这可能也不是我们想要的。您可以从模板中调用方法,如
到_json
方法。然而(正如Two正确指出的那样),您甚至不需要额外的方法来将数据转换为JSON—如果您将数据放在
标记之间,Go将自行完成转换。要自定义转换,请通过提供所述的
MarshalJSON
方法来实现
Marshaler
接口

以下示例演示如何在“脚本”上下文中使用方法直接输出结构:

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)
}
主程序包
进口(
“html/模板”
“日志”
“操作系统”
“字符串”
)
类型迎宾结构{
重复整数
称呼语串
}
func(g Greeter)Perform()字符串{
返回字符串。重复(g.saltation+“”,g.Repeat)
}
func main(){
sayHi:=迎宾{重复:3,问候:“嗨!”)
tmpl,err:=template.New(“”.Parse(“{{}}\n{{}}\n{{{.Perform}”)
如果错误!=零{
log.Fatalf(“解析:%v”,错误)
}
tmpl.Execute(os.Stdout,sayHi)
}

输出:

{3 Hi!}
<script>{"Repeat":3,"Salutation":"Hi!"}</script>
Hi! Hi! Hi!
{3 Hi!}
{“重复”:3,“问候”:“嗨!”}
你好你好你好

Revel建立在Go模板包的基础上,而不是实现自己的模板系统,因此上述内容也适用于Revel。

html/template
也具有上下文意识,因为它知道在将数据包含在
中时以不同的方式呈现相同的数据。查看just
{{someData}}
是否满足您的需求。如果您想自定义它的封送方式,请使用
MarshalJSON
,如感谢您指出的那样!我已经包含了您的输入,现在答案看起来完全不同了:)