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

时间:2014-11-24 12:34:32

标签: go template-engine revel

我来自Ruby / PHP背景,通常我在没有控制器的情况下直接从View中拉取模型,例如在erb文件中:

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

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

1 个答案:

答案 0 :(得分:2)

这种将代码直接嵌入到模板中的方法只能通过Ruby和PHP等解释语言来完成。 Go模板包支持一些简单的指令(如果,其他,范围等 - 请参阅here了解详细信息),但这种语法并不接近完整的脚本语言 - 这可能不是预期的无论是。您可以从模板中调用to_json方法等方法。但是(正如twotwotwo正确地指出的那样)你可能甚至不需要额外的方法来将数据转换为JSON - 如果你将它放在<script>标签之间,Go将自己进行转换。要自定义转化,请通过提供here所述的Marshaler方法来实施MarshalJSON界面。

以下示例演示如何直接在&#34;脚本中输出结构&#34;上下文并使用方法:

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。