2012-04-17 11 views
28

Se notó algo raro con las plantillas de ir cuando trato de usar Funcs y FuncMap. funciona el siguiente código como se esperaba:función de plantilla Ir

buffer := bytes.NewBufferString("") 

funcMap := template.FuncMap{ 
    "label": strings.Title, 
} 

t, _ := template.New("alex").Funcs(funcMap).Parse("{{label \"alex\"}}") 

t.Execute(buffer, "") 

return string(buffer.Bytes()) //=> "Alex" 

Pero cuando trato de poner la plantilla en un archivo, éste no funciona (Execute() dice: "alex" is an incomplete or empty template):

t, _ := template.New("alex").Funcs(funcMap).ParseFiles("template.html") 

Con template.html:

{{label \"alex\"}} 

Cualquier idea de por qué? ¿Es esto un error? ¿Hay formas más simples de usar métodos/funciones en las plantillas?

+0

Primeras ideas son para comprobar errores de analizar y ejecutar. Su código anterior ignora ambos. – Sonia

+0

Sí, había revisado Parse pero no Execute. Ejecutar dice: "" alex "es una plantilla incompleta o vacía" – Blacksad

Respuesta

31

ParseFiles probablemente podría usar una mejor documentación. Un objeto de plantilla puede tener múltiples plantillas y cada una tiene un nombre. Si nos fijamos en la implementación de ParseFiles, se ve que se utiliza el nombre del archivo como el nombre de la plantilla en el interior del objeto de plantilla. Por lo tanto, nombre su archivo igual que el objeto de la plantilla, (probablemente no sea en general práctico) o utilice ExecuteTemplate en lugar de simplemente Execute.

+1

¡Eres genial, funciona! Muy buena captura. Y me vi obligado a usar .Nuevo (nombre) porque sin esto no puedes llamar a .Funcs() ... – Blacksad

15

respuesta de Sonia es técnicamente correcto, pero me dejó aún más confusa. Así es como finalmente lo tengo funcionando:

t, err := template.New("_base.html").Funcs(funcs).ParseFiles("../view/_base.html", "../view/home.html") 
if err != nil { 
    fmt.Fprint(w, "Error:", err) 
    fmt.Println("Error:", err) 
    return 
} 
err = t.Execute(w, data) 
if err != nil { 
    fmt.Fprint(w, "Error:", err) 
    fmt.Println("Error:", err) 
} 

El nombre de la plantilla es el nombre dado testimonio de la plantilla, no la ruta completa. Execute ejecutará la plantilla por defecto siempre que esté llamado a la altura, así que no hay necesidad de utilizar ExecuteTemplate.

En este caso, _base.html archivo es el contenedor más externo, por ejemplo:

<!DOCTYPE html> 
<html><body> 
<h1>{{ template "title" }}</h1> 
{{ template "content" }} 
</body></html> 

mientras home.html define las partes específicas:

{{ define "title" }}Home{{ end }} 

{{ define "content" }} 
Stuff 
{{ end }} 
Cuestiones relacionadas