Go-template-常用方法详解-注意事项

Go template包下面有两个函数可以创建模板示例

func New(name string) *Template
func ParseFiles(filenames ...string) (*Template, error) 

首先要说的是每一个template内部可以存储多个模板 而且每个模板必须对应一个独立的名字

两个的不同点在于

使用New在创建时就为其添加一个模板名称 并且执行t.Execute()会默认去寻找该名称进行数据融合

使用ParseFiles创建模板可以一次指定多个文件加载多个模板进来 但是就不可以使用t.Execute()来执行数据融合

因为使用t.Execute()无法找到要使用哪个加载过的模板进行数据融合  而只有New创建时才会指定一个t.Execute()执行时默认加载的模板

但是ParseFiles可以通过

func (t *Template) ExecuteTemplate(wr io.Writer, name string, data interface{}) error

来进行数据融合因为该函数可以指定模板名因此 实例模板就可以知道要去加载自己内部的哪一个模板进行数据融合

当然无论使用New还是ParseFiles创建模板都是可以使用ExecuteTemplate来进行数据融合

但是对于Execute一般与New创建的模板进行配合使用


html/template text/template

html下的template结构体 实际上是继承了 text下面的template结构体

template包下面还有一个ParseGlob方法用于批量解析文件比如在当前目录下有以h开头的模板10个

使用template.ParseGlob("h*")即可页将10个模板文件一起解析出来


注意事项

下面这段代码的输出一定为空

t := template.New("haha")
t,err := t.ParseFiles("header.tmpl")
fmt.Println(err)
t.Execute(os.Stdout, nil)
原因是为什么呢.....  
首先先记住一个原则 template.New和ParseFiles()最好不要一起使用
如果非要一起使用那么要记住 
New("TName") 中的TName 必须要和header.tmpl中定义的{{define name}}中的name同名
但是正常的做法应该是这样的 同样的ExecuteTemplate中输入的name也必须和模板中[{define name}}相同
t,_ := template.ParseFiles("header.tmpl")
t.ExecuteTemplate(os.Stdout, "header",nil)
这里要注意下 在这种情况下如果使用t.Execute也是不会输出任何结果的 因为他并不知道你要使用哪个模板


另外一点要注意的就是

如果模板中没有与填充数据对应的模板语言 那么很有可能panic



模板中{{}}花括号表达式 自动实现了对js代码的过滤 
如何不过滤js代码呢 只需要使用text/template包下的template
因为html/template包下的模板实现一些针对html的安全操作包括过滤js代码


Golang 当中支持 Pipeline 一样是使用 |
Go允许在模板中自定义变量
Go中还支持定义模板函数
函数定义必须遵循如下格式
func FuncName(args ...interface{}) string
通过template.FuncMap()强制类型转换为FuncMap类型
然后再通过template实例的Func(FuncMap)添加在模板实例中
这样该模板内部在解析时就可以使用该函数
Go模板包中自定义了一系列内置函数
var builtins = FuncMap{
"and":      and,
"call":     call,
"html":     HTMLEscaper,
"index":    index,
"js":       JSEscaper,
"len":      length,
"not":      not,
"or":       or,
"print":    fmt.Sprint,
"printf":   fmt.Sprintf,
"println":  fmt.Sprintln,
"urlquery": URLQueryEscaper,


// Comparisons
"eq": eq, // ==
"ge": ge, // >=
"gt": gt, // >
"le": le, // <=
"lt": lt, // <
"ne": ne, // !=
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
对不起,我理解错了您的要求。要使用ng-template来调用方法,您可以按照以下步骤操作: 1. 在组件中声明一个TemplateRef变量,并将其注入到构造函数中。例如: ```typescript constructor(private templateRef: TemplateRef<any>) { } ``` 2. 在模板中使用ng-template,并将其绑定到一个变量上。例如: ```html <ng-template #myTemplate> <button (click)="myMethod()">调用方法</button> </ng-template> ``` 3. 在组件中定义一个方法,该方法将使用ViewContainerRef来创建一个嵌入视图,并将ng-template作为参数传递给createEmbeddedView方法。例如: ```typescript import { ViewContainerRef } from '@angular/core'; myMethod() { this.viewContainerRef.clear(); this.viewContainerRef.createEmbeddedView(this.templateRef); } ``` 请注意,我还添加了`ViewContainerRef`作为依赖注入,并在`myMethod`方法中使用了`clear`方法来清除视图容器中的任何现有内容。 4. 在组件的模板中,使用`ng-container`来放置嵌入视图。例如: ```html <ng-container #container></ng-container> ``` 5. 在组件的类中,使用ViewChild装饰器来获取`ViewContainerRef`的引用。例如: ```typescript @ViewChild('container', { read: ViewContainerRef }) viewContainerRef: ViewContainerRef; ``` 这样,当调用`myMethod()`方法时,将会创建一个嵌入视图,并将ng-template的内容插入到`ng-container`中。 希望这样能满足您的要求!如果您还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值