Вытягивание модели непосредственно из механизма шаблонов Revel

Я пришел из Ruby/PHP фона, обычно я использую вытягивание модели из представления напрямую без контроллера, например, внутри файла erb:

<script>
  var vm = {
    rows: <%= ModelName.rows.to_json %>
  };
  // render vm.rows using client-side javascript
</script>
<div> 
  bla bla
</div>

Можно ли вытащить модель так же, как я сделал в erb, внутри шаблона Go/Revel?


person Kokizzu    schedule 24.11.2014    source источник


Ответы (1)


Этот метод встраивания кода непосредственно в шаблон можно использовать только с интерпретируемыми языками, такими как Ruby и PHP. Пакеты шаблонов Go поддерживают несколько простых инструкций (если, иначе, диапазон и т. д. — см. здесь детали), но этот синтаксис и близко не подходит к полноценному языку сценариев - вероятно, он тоже не предназначен. Вы можете вызывать такие методы, как ваш метод to_json, из шаблонов. Однако (как справедливо заметил twotwotwo) вам может даже не понадобиться дополнительный метод для преобразования ваших данных в JSON — если вы поместите его между тегами <script>, Go выполнит преобразование самостоятельно. Чтобы настроить преобразование, реализуйте интерфейс Marshaler, предоставив метод MarshalJSON, как описано здесь.

В следующем примере демонстрируется прямой вывод структуры в контексте "сценария" и использование метода:

package main

import (
    "html/template"
    "log"
    "os"
    "strings"
)

type Greeter struct {
    Repeat     int
    Salutation string
}

func (g Greeter) Perform() string {
    return strings.Repeat(g.Salutation+" ", g.Repeat)
}

func main() {
    sayHi := Greeter{Repeat: 3, Salutation: "Hi!"}
    tmpl, err := template.New("").Parse("{{.}}\n<script>{{.}}</script>\n{{.Perform}}")
    if err != nil {
        log.Fatalf("Parse: %v", err)
    }
    tmpl.Execute(os.Stdout, sayHi)
}

http://play.golang.org/p/f3HShZfd6H

Выход:

{3 Hi!}
<script>{"Repeat":3,"Salutation":"Hi!"}</script>
Hi! Hi! Hi!

Revel основывается на пакетах шаблонов Go, а не реализует собственную систему шаблонов, поэтому вышеизложенное применимо и к Revel.

person rob74    schedule 24.11.2014
comment
html/template также является контекстно-зависимым, так как он знает, как представлять одни и те же данные по-разному, когда вы включаете данные внутри <script></script>. Посмотрите, делает ли только <script>{{ someData }}</script> то, что вам нужно. Если вы хотите настроить маршаллинг, используйте MarshalJSON, как описано на golang.org/pkg/encoding /json/#Маршалер - person twotwotwo; 24.11.2014
comment
Спасибо что подметил это! Я включил ваш вклад, и теперь ответ выглядит совсем иначе :) - person rob74; 25.11.2014