2016-08-26 5 views
3

Я использую джин шаблонов и для визуализации HTML я используюКак получить доступ к переменной во всех JS файлы HTML-Go-джин

c.Writer.Header().Set("username", "myname") 
c.HTML(200, "myservices", gin.H{ 
    "title": "Dashboard", 
    "username": "myname" }) 

Я хочу передать переменную (имя пользователя), так что я могу доступ в файлы js, прикрепленные к моему шаблону. Я могу получить доступ к переменной имени пользователя в шаблоне, используя {{.username}}. Как сделать его глобальным, чтобы я мог также получить к нему доступ ко всем файлам js. Я попытался установить его в заголовке, но я могу получить доступ к нему только при загрузке HTML. Я не смогу использовать его до загрузки шаблона.

ответ

2

Вы можете вставить Javascript-код в HTML-страницу (например, в разделе <head>), где вы создаете переменные Javascript и инициализируете их параметрами, переданными при выполнении шаблона.

Смотрите этот пример:

func main() { 
    t := template.Must(template.New("").Parse(templ)) 
    m := map[string]interface{}{ 
     "title": "Test page", 
     "username": "bob", 
     "counter": 12, 
    } 
    if err := t.Execute(os.Stdout, m); err != nil { 
     panic(err) 
    } 
} 

const templ = `<html><head> 
<script> 
    var _title = {{.title}}; 
    var _username = {{.username}}; 
    var _counter = {{.counter}}; 
</script> 
</head><body> 
</body> 
</html>` 

Это приводит к HTML-документа (попробуйте его на Go Playground):

<html><head> 
<script> 
    var _title = "Test page"; 
    var _username = "bob"; 
    var _counter = 12 ; 
</script> 
</head><body> 
</body> 
</html> 

Что это означает, что другие Javascript код на странице (или встраиваемыми или ссылочный, внешний) будут видеть переменные _title, _username, _counter и использовать их как обычные переменные, и они инициализируются значениями, которые мы передали Template.Execute().

Обратите внимание, что пакет html/template выполняет контекстное экранирование. Посмотрите, что он вставил результат {{.title}} в кавычки, потому что это string, и вот как это должно быть написано в коде Javascript, но при добавлении результата {{.counter}} кавычек не было добавлено, потому что это значение типа int.

Также обратите внимание, что вы должны использовать уникальную стратегию именования, чтобы избежать столкновения с существующими переменными или переменными, которые могут использоваться в другом коде Javascript. Обычно используется специальный префикс (или постфикс).

Также проверьте этот родственный вопрос: Referencing Go array in Javascript

+0

мы действительно должны использовать Template.Execute(). Не можем ли мы передать переменные так, как я использовал c.HTML? Я могу получить доступ к этим переменным как '{{.username}}'. Разве я не могу хранить их как глобальные переменные, как вы? – aaj

+0

@ love2code Вам не нужно использовать это, вы можете просто передать их с помощью 'c.HTML()'. Я использовал 'Template.Execute()' так, чтобы он работал на Go Playground, потому что пакет 'github.com/gin-gonic/gin' не может быть импортирован там. Принцип создания и инициализации переменных Javascript - это то, что важно, остальное - это просто, чтобы он мог работать на игровой площадке Go. – icza