我开始编写Gin应用程序,我的项目树看起来像
-assets
--css
---{bootstrap}
-templates
--layouts
---footer.html
---head.html
---header.html
--book.html
-main.go
在main.go中,我加载了模板,没有错误
router.LoadHTMLGlob("./templates/layouts/*.html")
我定义模板
{{ define "head" }}
<head>
//Head
</head>
{{ end }}
然后我将它们嵌套
{{ define "header" }}
{{ template "head.html" . }}
//HTML
{{ end }}
但是当我尝试使用它们时,输出为空
{{ template "header" . }}
<h1>{{ .Title}}</h1>
<h3>{{ .Author.Fullname}}</h3>
[Edit]执行模板的功能:
func getBook(c *gin.Context) {
//DB stuff
var book models.Book
t, err := template.ParseFiles("templates/book.html")
if err != nil {
log.Println(err)
}
t.Execute(c.Writer, book)
}
完整代码可在github上找到
答案 0 :(得分:1)
public void onReceive(Context context, Intent intent) {
super.onReceive(context,intent);
if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED) ||
intent.getAction().equals(Intent.ACTION_LOCKED_BOOT_COMPLETED)){
Intent mainActivityIntent = MainActivity.newIntent(context);
// set flag on mainActivityIntent
mainActivityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(mainActivityIntent);}
}
和router.LoadHTMLGlob
是两种处理模板的独立方法。 template.ParseFiles
返回的模板不了解ParseFiles
加载的模板。一旦决定使用LoadHTMLGlob
,就应该使用c.HTML
渲染模板。此c.HTML
方法的LoadHTMLGlob
自变量可以是name
action 中指定的名称,也可以是该方法的基本名称模板文件(包括我认为的扩展范围)。
因此,在您的情况下,您可能应该执行以下操作:
{{define "name"}}
可以在此处找到更多示例:https://gin-gonic.com/docs/examples/html-rendering/
请记住,LoadHTMLGlob
依赖于template.ParseGlob
,其中指出:
以不同的名称解析具有相同名称的多个文件时 目录,最后提到的将是结果目录。
这意味着,如果您希望所有模板都可以通过c.HTML(http.StatusOK, "book.html", book)
访问,则需要确保它们具有唯一的基本名称,或者它们必须包含{{1 }}操作。
答案 1 :(得分:0)
从默认模板系统移到Gin有点混乱,默认模板系统使“一切都简单地工作”,这有点混乱,即使用文件作为模板时似乎存在一些命名限制。我不知道是否是这种情况,但是在我的设置中,我必须确保:
define
关键字)必须为 filename -至少是模板中唯一的define
时(我尚未测试)包含多个defines
)-例如,如果您使用./templates/book.html
作为模板,则需要在该文件的顶部放置{{ define "book.html" }}
(对于其他模板中包含的模板,这是正确的;我没有尝试过blocks
或其他更深奥的方法来将jinx模板结合在一起)c.HTML(http.StatusOK, "book.html", book)
时,必须输入包含该模板的文件的全名(如图所示!)换句话说,尽管手册中另有说明,@ mkopriva确认了手册中的内容,但我有不同的经验:只是我开始将文件名与define
和{{1}进行匹配}称我停止获取空白页...
此外,从控制台(在调试模式下)运行时,很明显,我的程序正在“查找”远远超出应有的模板,即几乎每个模板都被复制了(一个文件名副本,另一个文件名副本)。 c.HTML()
等)。这不仅使我困惑,而且使应用程序本身感到困惑。