猿问

如何将 FuncMaps 添加到 golang 中已解析的模板中

我有我的模板,这些模板最初是在应用程序启动时解析的(显然是出于这样的速度原因)


var templates = template.New("template")


filepath.Walk("views", func(path string, info os.FileInfo, err error) error {

        if strings.HasSuffix(path, ".html") {

            templates.ParseFiles(path)

        }


        return nil

})

log.Println("Templates Parsed")

然后我将我的 funcmaps 添加到它们自己的函数中(因为我需要请求对象,所以我可以像这样获取它们的会话数据)


func View(w http.ResponseWriter, r *http.Request, tmplN string, data interface{}) {


    tmpl := templates.Funcs(template.FuncMap{

        "username": func() string {

            session := Sesh(r)

            username := ""

            if session.Values["username"] != nil {

                username = session.Values["username"].(string)

            }

            return username

        },

        "authenticated": func() bool {

            session := Sesh(r)

            authenticated := false

            if session.Values["authenticated"] != nil {

                authenticated = session.Values["authenticated"].(bool)

            }

            return authenticated

        },

    })


    err := tmpl.ExecuteTemplate(w, tmplN, data)

    if err != nil {

        log.Println("Error " + err.Error())

    }

}

但似乎如果我Funcs在解析模板之前不调用它就不起作用,例如,如果我尝试在我的register模板中使用,如下所示:


{{ define "register" }}

    {{ template "_header" .}}


       {{ if authenticated }}

           // Call FuncMap function

       {{ end }}

<br/>

<br/>

<br/>

<div class="row align-center">

    <div class="large-4 columns text-center">

        <div id="RegistrationFormComponent"></div>

    </div>

</div>

    {{ template "_footer" .}}

{{ end }}

我收到“注册”不存在的错误,因为该函数authenticated在尝试解析它时抛出错误。任何有关如何使其按预期工作的信息都将非常感谢。


呼如林
浏览 230回答 1
1回答

不负相思意

所以我想通了,但我将这个答案留在这里,因为它似乎在任何地方都没有答案,基本上我可以定义一个冗余FuncMap来模拟我将在会话中使用的那个,然后将它们返回空白,然后我可以用FuncMap我的view函数(在问题帖子中可见)覆盖它们,如下所示:var templates = template.New("template").Funcs(template.FuncMap{&nbsp; &nbsp; "authenticated": func() bool {&nbsp; &nbsp; &nbsp; &nbsp; log.Println("Was I called?")&nbsp; &nbsp; &nbsp; &nbsp; return false&nbsp; &nbsp; },&nbsp; &nbsp; "username": func() string {&nbsp; &nbsp; &nbsp; &nbsp; return ""&nbsp; &nbsp; },})
随时随地看视频慕课网APP

相关分类

Go
我要回答