2015-12-30 31 views
1

已解析的模板,我有我的模板,最初解析在应用程序启动(显然对速度的原因是这样)如何添加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抛出时,它试图解析它的错误。任何有关我如何按预期工作的信息都将非常感谢。

回答

1

所以我想通了,但我在这里留下这个答案,因为它似乎没有在任何地方回答,基本上我可以定义一个多余的FuncMap模仿我将用于会话的一个冗余,然后只是返回它们空白,然后我可以使用view功能中的FuncMap覆盖它们(在问题中可见),如下所示:

var templates = template.New("template").Funcs(template.FuncMap{ 
    "authenticated": func() bool { 
     log.Println("Was I called?") 
     return false 
    }, 
    "username": func() string { 
     return "" 
    }, 
})