Кодовый блок Голанг и Мартини

Я пытаюсь определить блоки кода, которые будут вставлены в базовый шаблон, если они определены. Я не хочу включать все сценарии, которые требуются на одной странице, на другую, которая этого не требует.

Я использую:

"github.com/go-martini/martini"
"github.com/martini-contrib/binding"
"github.com/martini-contrib/render"

В основном то, что я пытаюсь сделать, это что-то вроде:

на макете: admin.tmpl:

<script src="jquery.min.js"></script>
<script src="scripts.min.js"></script>
{{ footer_extra }}

и на new.tmpl:

{{define "footer_extra"}}
  <!-- scripts just for this page -->
  <script src="script-1.js"></script>
  <script src="script-2.js"></script>
  <script src="script-3.js"></script>
{{end}}

Казалось, работает, когда я использовал шаблон вместо.

Но я заметил, что не могу определить более одного шаблона, который побеждает то, что я пытаюсь достичь.

index.tmpl

{{define "footer_extra"}}
  <!-- scripts just for this page -->
  <script src="script-1.js"></script>
  <script src="script-2.js"></script>
{{end}}

new.tmpl

{{define "footer_extra"}}
  <!-- scripts just for this page -->
  <script src="script-3.js"></script>
  <script src="script-4.js"></script>
{{end}}

layout.tmpl

<script src="main.js"></script>
{{template "footer_extra"}}

бросит PANICtemplate: redefinition of template "footer_extra"

1 ответ

Я знаю, что это нелогично, но по соображениям производительности лучше объединить весь ваш javascript в несколько файлов и включить их на каждой странице.

Но если вы все еще хотите это сделать, есть два способа решения проблемы:

  1. Дайте другой footer_extra другое имя, а затем явно указывайте его в своем шаблоне:

    <script src="jquery.min.js"></script>
    <script src="scripts.min.js"></script>
    {{ admin_footer_extra }}
    
  2. Сделайте нижнюю часть данных, которые вы отправляете в шаблон:

    var buf bytes.Buffer
    // or ParseFiles if that's how you're reading these
    tpl := template.Must(template.New("").Parse(tpls))
    // render the footer
    tpl.ExecuteTemplate(&buf, "footer_extra", nil)
    footer := buf.String()
    buf.Reset()
    // send the footer to the main template
    tpl.ExecuteTemplate(&buf, "index", map[string]interface{}{
        "Footer": template.HTML(footer), 
                        //  ^   this makes it so go won't escape < & >
    })
    

    Тогда ваш шаблон будет просто иметь:

    {{define "page1"}}
      {{.Footer}}
    {{end}}
    
Другие вопросы по тегам