staffID
@staffID

От чего такая штука в шаблоне html?

Golang:
data, err := json.Marshal(Data)
log.Print(data);
//Вернет
//[{"ID":"1"}]

Код в шаблоне:
var data = JSON.parse( "{{.Data.data}}" );
//Результат
//var data = JSON.parse( "[{\x22ID\x22:\x221\x22}]" );
  • Вопрос задан
  • 327 просмотров
Решения вопроса 1
Это валидная javscript-запись для строки [{"ID":"1"}]

Но можно сделать красивее: https://play.golang.org/p/brmFG2PGJD
package main

import (
	"bytes"
	"fmt"
	"html/template"
	"log"
)

func main() {

	out := bytes.NewBuffer([]byte{})
	t, err := template.New("foo").Parse(`<!DOCTYPE html>
<html>
<head>
    <title></title>
    <script type="text/javascript">
        var data = JSON.parse( {{.}} );
    </script>
</head>
<body>
</body>
</html>`)
	if err != nil {
		log.Fatal("Cannot parse the template: ", err)
	}

	err = t.Execute(out, `[{"ID":"1"}]`)
	if err != nil {
		log.Fatal("Cannot execute the template: ", err)
	}

	fmt.Println(string(out.Bytes()))
}


А можно ещё красивее: https://play.golang.org/p/Ir4wLhHMuV
package main

import (
	"bytes"
	"fmt"
	"html/template"
	"log"
)

type A []struct {
	ID string
}

func main() {

	out := bytes.NewBuffer([]byte{})
	t, err := template.New("foo").Parse(`<!DOCTYPE html>
<html>
<head>
    <title></title>
    <script type="text/javascript">
        var data = {{.}};
    </script>
</head>
<body>
</body>
</html>`)
	if err != nil {
		log.Fatal("Cannot parse the template: ", err)
	}

	data := A{
		{ID: "1"},
	}

	err = t.Execute(out, data)
	if err != nil {
		log.Fatal("Cannot execute the template: ", err)
	}

	fmt.Println(string(out.Bytes()))
}


Причина в том, что т.к. Go не может полностью распарсить грамматику js, он подстраховывается, чтобы случайно не допустить code injection.
Go видит скобки и понимает, что ему надо вставить содержимое строкового литерала js, но т.к. он не может полностью гарантировать, что мы будем внутри скобок, то подстраховывается и эскейпит управляющие символы, чтобы в случае ошибки js просто остановился, но не выполнил вставленный код.
Шаблоны нацелены только на вставку данных и должны гарантировать программисту, что эти данные не будут выполнены как код (если конечно вы сами там eval не вставите).
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы