gpt4 book ai didi

可调用自身的Golang模板FuncMap

转载 作者:数据小太阳 更新时间:2023-10-29 03:13:47 26 4
gpt4 key购买 nike

我正在尝试实现一个添加到基本模板中的 FuncMaps 的函数,这个函数应该用于呈现可重用的 View 组件

例如:

func (v *Item) RenderComponent(componentPath string, vars ...interface{}) template.HTML {
p := path.Join(v.folder, "components", componentPath)

// Get the pieces of the component path.
componentPathPieces := strings.Split(p, "/")

// Get the last item in the pieces (this should be the file name).
componentFileName := componentPathPieces[len(componentPathPieces)-1]

// Make the new template using component file name and add FuncMap functions.
t := template.New(componentFileName).Funcs(v.funcMap)

// Determine if there is an error in the template syntax.
t, err := template.ParseFiles(p + "." + v.extension)
if err != nil {
panic(err)
}

// Add variables to the component and write to a buffer.
b := new(bytes.Buffer)
if err = t.Execute(b, vars); err != nil {
panic(err)
}

// Return the contents of the template buffer as a string of HTML.
return template.HTML(b.String())
}

此代码适用于不呈现其他组件的组件。例如,我可以编写 {{component "buttons/default-button""some url goes here"}} 它将在 components/button/default-button.tmpl 呈现组件 就好了。

但是,如果我在该默认按钮组件中包含另一个组件,例如 {{component "icons/check-icon"}},我将收到一个大错误(太大而无法粘贴这里)。但这是错误消息之一:

template: default-button.tmpl:4: function "component" not defined

如您所见,错误是从试图调用另一个组件的组件文件中抛出的。我相信这是因为 viewFunc 没有被正确添加,或者以某种方式被递归调用。

最佳答案

糟糕,看来我打错了。

不得不改变这个:

// Make the new template using component file name and add FuncMap functions.
t := template.New(componentFileName).Funcs(v.funcMap)

// Determine if there is an error in the template syntax.
t, err := template.ParseFiles(p + "." + v.extension)

...为此:

// Make the new template using component file name and add FuncMap functions.
t := template.New(componentFileName + "." + v.extension).Funcs(v.funcMap) // <---- 'componentFileName' to 'componentFileName + "." + v.extension'

// Determine if there is an error in the template syntax.
t, err := t.ParseFiles(p + "." + v.extension) // <---- 'template' to 't'

我引用的是 template 包,而不是我创建的 t 模板。我还为 template.New 传递了错误的名称,因为它需要一个完整的填充,例如 index.tmpl,而不仅仅是 index

现在一切正常!可以从另一个组件调用组件。

关于可调用自身的Golang模板FuncMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43284246/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com