You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: en/07.4.md
+29-27
Original file line number
Diff line number
Diff line change
@@ -9,11 +9,11 @@ The following demonstrates the template mechanism:
9
9
10
10
Figure 7.1 Template mechanism
11
11
12
-
Most of the content that web applications respond to clients with is static, and the dynamic parts are usually very small. For example, if you need to display a list users who have visited a page, only the user name would be dynamic. The style of the list remains the same. As you can see, templates are useful for reusing static content.
12
+
Most of the content that web applications respond to clients with is static, and the dynamic parts are usually very small. For example, if you need to display a list users who have visited a page, only the user name would be dynamic. The style of the list remains the same. As you can see, templates are useful for reusing static content.
13
13
14
14
## Templating in Go
15
15
16
-
In Go, we have the `template` package to help handle templates. We can use functions like `Parse`, `ParseFile` and `Execute` to load templates from plain text or files, then evaluate the dynamic parts, as shown in figure 7.1.
16
+
In Go, we have the `template` package to help handle templates. We can use functions like `Parse`, `ParseFile` and `Execute` to load templates from plain text or files, then evaluate the dynamic parts, as shown in figure 7.1.
17
17
18
18
Example:
19
19
@@ -75,8 +75,8 @@ If you print `{{.}}` in a template, Go outputs a formatted string of this object
75
75
76
76
We know how to output a field now. What if the field is an object, and it also has its own fields? How do we print them all in one loop? We can use `{{with …}}…{{end}}` and `{{range …}}{{end}}` for exactly that purpose.
77
77
78
-
-`{{range}}` just like range in Go.
79
-
-`{{with}}` lets you write the same object name once and use `.` as shorthand for it ( ***Similar to `with` in VB*** ).
78
+
-{% raw %}`{{range}}`{% endraw %} just like range in Go.
79
+
-{% raw %}`{{with}}`{% endraw %} lets you write the same object name once and use `.` as shorthand for it ( ***Similar to `with` in VB*** ).
80
80
81
81
More examples:
82
82
@@ -305,6 +305,7 @@ Here's a complete example, supposing that we have the following three files: `he
305
305
306
306
Main template:
307
307
308
+
{% raw %}
308
309
//header.tmpl
309
310
{{define "header"}}
310
311
<html>
@@ -330,10 +331,11 @@ Main template:
330
331
</body>
331
332
</html>
332
333
{{end}}
333
-
334
-
//When using subtemplating make sure that you have parsed each sub template file,
334
+
335
+
//When using subtemplating make sure that you have parsed each sub template file,
335
336
//otherwise the compiler wouldn't understand what to substitute when it reads the {{template "header"}}
templates, err = template.ParseFiles(allFiles...) #parses all .tmpl files in the 'templates' folder
364
-
366
+
365
367
s1, _ := templates.LookUp("header.tmpl")
366
368
s1.ExecuteTemplate(os.Stdout, "header", nil)
367
369
fmt.Println()
368
-
s2, _ := templates.LookUp("content.tmpl")
370
+
s2, _ := templates.LookUp("content.tmpl")
369
371
s2.ExecuteTemplate(os.Stdout, "content", nil)
370
372
fmt.Println()
371
373
s3, _ := templates.LookUp("footer.tmpl")
@@ -380,19 +382,19 @@ When you don't want to use `{{define}}`, then you can just create a text file wi
380
382
381
383
Templates in one set know each other, but you must parse them for every single set.
382
384
383
-
Some times you want to contextualize templates, for instance you have a `_head.html`, you might have a header who's value you have to populate based on which data you are loading for instance for a todo list manager you can have three categories `pending`, `completed`, `deleted`. for this suppose you have an if statement like this
385
+
Some times you want to contextualize templates, for instance you have a `_head.html`, you might have a header who's value you have to populate based on which data you are loading for instance for a todo list manager you can have three categories `pending`, `completed`, `deleted`. for this suppose you have an if statement like this
384
386
385
-
<title>{{if eq .Navigation "pending"}} Tasks
387
+
<title>{{if eq .Navigation "pending"}} Tasks
386
388
{{ else if eq .Navigation "completed"}}Completed
387
389
{{ else if eq .Navigation "deleted"}}Deleted
388
390
{{ else if eq .Navigation "edit"}} Edit
389
391
{{end}}
390
392
</title>
391
-
393
+
392
394
Note: Go templates follow the Polish notation while performing the comparison where you give the operator first and the comparison value and the value to be compared with. The else if part is pretty straight forward
393
395
394
396
Typically we use a `{{ range }}` operator to loop through the context variable which we pass to the template while execution like this:
395
-
397
+
396
398
//present in views package
397
399
context := db.GetTasks("pending") //true when you want non deleted notes
398
400
homeTemplate.Execute(w, context)
@@ -412,31 +414,31 @@ We get the context object from the database as a struct object, the definition i
//This line is in the database package where the context is returned back to the view.
422
-
423
-
We use the task array and the Navigation in our templates, we saw how we use the Navigation in the template,
424
+
425
+
We use the task array and the Navigation in our templates, we saw how we use the Navigation in the template,
424
426
we'll see how we'll use the actual task array in our template.
425
-
427
+
426
428
Here in the `{{ if .Tasks }}` we first check if the Tasks field of our context object which we passed to the template
427
429
while executing is empty or not. If it is not empty then we will range through that array to populate the title and
428
430
content of Task. The below example is very important when it comes to looping through an array in a template, we
429
431
start with the Range operator, then we can give any member of that struct as `{{.Name}}`, my Task structure has a
430
432
Title and a Content, (please note the capital T and C, they are exported names and they need to be capitalised unless you
431
433
want to make them private).
432
-
433
-
so {{ range .Tasks }}
434
-
{{ .Title }}
435
-
{{ .Content }}
436
-
{{ end }}
437
-
434
+
435
+
{{ range .Tasks }}
436
+
{{ .Title }}
437
+
{{ .Content }}
438
+
{{ end }}
439
+
438
440
This block of code will print each title and content of the Task array. Below is a full example from github.com/thewhitetulip/Tasks home.html template.
0 commit comments