Как определить тег с помощью Play 2.0?

#scala #tags #playframework #playframework-2.0

#scala #Теги #playframework #playframework-2.0

Вопрос:

Существует не так много документации о движке шаблонов Play 2.0.

Как создать тег с помощью шаблона Scala?

Ответ №1:

Механизм шаблонов в play 2.0 напрямую поступает из модуля play 1.0 scala. Если вам все еще интересно, какие преимущества приносит функциональный язык, такой как Scala, в картину, что ж, это, безусловно, одна из областей, где он сияет.

Демонстрация:

В синтаксисе scala тег — это не что иное, как вызов функции. что интересно, так это то, что фрагменты html рассматриваются как сами функции, что позволяет использовать самые мощные конструкции подстановки.

Давайте определим html-страницу с именем mytag.scala.html

file:apps/views/mytags/mytag.scala.html

 @(level:String = "error", index: Int)(body: (String) => Html)

@level match {

    case "success" => {
        <p class="success" index="@index">
            @body("green")
        </p>
    }

    case "warning" => {
        <p class="warning" index="@index">
            @body("orange")
        </p>
    }

    case "error" => {
        <p class="error" index="@index">
            @body("red")
        </p>
    }    
}
  

Приведенный выше тег принимает 3 параметра в 2 разных группах параметров:

  1. Уровень, представленный строкой (которая по умолчанию имеет значение «ошибка»)
  2. Индекс
  3. Наконец, функция с именем body, которая принимает строковый параметр и возвращает HTML-код. Обратите внимание, что тело определяется в своей собственной группе параметров. это эквивалентно тому, что мы знаем в j2ee как фрагмент jsp.

Теперь давайте посмотрим, как мы можем использовать этот тег:

 @import views.mytags._

@mytag("error",2) { color =>
    Oops, something is <span style="color:@color">wrong</span>
}
  

Прежде чем мы сможем использовать тег (или функцию), нам нужно сообщить Play, где он находится: это цель инструкции import . Обратите внимание, что местоположение (путь) файла тега не имеет значения, пока вы настраиваете местоположение импорта, как и в пакетах Java.

Следует за самим вызовом, который довольно прост. Однако обратите внимание, что мы передаем параметризованный фрагмент html в тег.

Для получения дополнительной информации вы можете найти документацию по шаблону scala по этому URL

Play 2.0 в конечном итоге будет поставляться со своей собственной документацией.

Ответ №2:

Совершенно ненужный ответ, но просто для обучения моего scala. Разве это не сработало бы и было бы короче, оставаясь понятным?

 @(level:String = "error", index: Int)(body: (String) => Html)

<p class="@level" index="@index">
    @body(
       @level match {
         case "success" => "green"
         case "warning" => "orange"
         case "error" => "red"
       }
    )
</p>
  

Комментарии:

1. Я, честно говоря, не знаю, пока не эксперт по scala. похоже, хороший вопрос по SO.

2. Я должен повторить play2.0 в ближайшее время. В прошлый раз это было действительно слишком сыро для моих экспериментов! Я еще не эксперт по Scala, но я многому научился, и до сих пор это единственный язык, который создает у меня впечатление, что я определенно мог бы отключить Java в конце 😉

3. В этом случае, если level — это что-то иное, чем успех, предупреждение или ошибка, у вас будет тег p с этим классом css, который может не иметь отступа. В ответе от @Olivier Refalo тег P будет напечатан только в том случае, если он соответствует одному из уровней ошибок.

4. на самом деле, если это не одно из этих 3 значений, это ошибка совпадения — как написано, этот тег настаивает на действительном переданном «уровне» — ваш подход лучше.

Ответ №3:

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

используйте @import mytags._

Полный пример (http://www.playframework.com/documentation/2.1.1/JavaTemplateUseCases ):

 Let’s write a simple views/tags/notice.scala.html 
tag that displays an HTML notice:

@(level: String = "error")(body: (String) => Html)

@level match {

  case "success" => {
    <p class="success">
      @body("green")
    </p>
  }

  case "warning" => {
    <p class="warning">
      @body("orange")
    </p>
  }

  case "error" => {
    <p class="error">
      @body("red")
    </p>
  }

}
  

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

@импортировать теги._
@notice(«ошибка») { color => Ой, что-то не так }