2016-01-06 10 views
2

В Play Framework внутри шаблона можно определить функции, как, что:Многоразовые функции между шаблонами в Play Framework шаблоны

@title(text: String) = @{ 
    text.split(' ').map(_.capitalize).mkString(" ") 
} 

<h1>@title("hello world")</h1> 

Могу ли я определить такую ​​функцию в отдельный файл и сделать его многоразовым между несколькими шаблонами?

ответ

2

Есть по крайней мере, несколько решений:

Первого в использовании tags в Makis показал вам, и в большинстве случаев это нормально, даже если он добавляет дополнительные пустые строки не имеет значения (по крайней мере, мы говорим о создании фрагментов HTML, то есть представляющих повторяющиеся элементы новостей в списке) - вы можете, например, оптимизировать/сжать свой HTML в постпроцессе, если вас интересуют скорости передачи.

Второй создает объект Scala, который содержит статические функции (в Java это возможно) и возвращает play.twirl.api.Html("<div>your code</div>"), таким образом, вы можете программно соответствовать код в точности так, как вам нужно, избегать пустых строк, удалить или заменить пробелы, и т. д. Как раз в вашем шаблоне вам нужно будет использовать синтаксис вроде: @full.qualified.path.to.Object.method("foo", "bar"), возвращающий Html("..."), что вам не нужно избегать возвращенного кода в вашем представлении.

Третьего подход использует собственные TemplateMagic подобных методов, которые позволяют вам расширить объектов любого типа и выполнить некоторую логику на нем, хороший образец "active".when(someCondition) синтаксиса, вы можете увидеть, как это делается in the repo. Конечно, вам нужно просто создать собственный класс, подобный этому, и импортировать его в начале вашего представления. Также имейте в виду, что это не обязательно должен быть только один аргумент Boolean, ваши методы могут использовать столько параметров, сколько вам нужно - любой тип, который вам нужен. Это может быть просто без параметров.

редактировать - образец:

приложение/MyAPI/MyMagic.scala

package myapi 

import play.twirl.api.Html 

import scala.language.implicitConversions 

object MyMagic { 

    class RichString(string: String) { 

    def upperWords() = { 
     Html(string.split(' ').map(_.capitalize).mkString(" ")) 
    } 

    def bold() = { 
     Html("<b>" + string + "</b>") 
    } 

    def when(predicate: => Boolean) = { 
     predicate match { 
     case true => string 
     case false => "" 
     } 
    } 

    } 

    implicit def richString(string: String): RichString = new RichString(string) 
} 

использование в представлении (ы)

@(title: String) 
@import myapi.MyMagic._ 

@main("Welcome to Play") { 

    @title.upperWords() <br> 
    @{"foo bar baz".upperWords()} <br> 
    @{"I'm bolded LOL".bold()} <br> 

    <ul> 
     @for(item <- 1 to 10){ 
      <li >Item no.: @{item} @{"(first item)".when(item==1)}</li> 
     } 
    </ul>  
} 
+0

Во втором случае я думаю, что методы могут вернуться, например, только к String. В этом случае мне не нужно будет использовать Html(), чтобы избежать экранирования. – szymond

+0

Кстати, вопрос состоял в том, что в шаблонах есть многократно используемые функции - похоже, это невозможно. Я думаю, вы должны поставить это в ответ, прежде чем упомянуть, как преодолеть эту проблему. – szymond

1

Вы можете создать новый файл с именем title.scala.html с этим содержимым:

@(text: String) 

@title(text: String) = @{ 
    text.split(' ').map(_.capitalize).mkString(" ") 
} 

@title(text) 

Затем вы можете использовать его в шаблонах, как хотелось бы.

+0

Но результат будет содержать все эти новые строки, которые появляются в title.scala.html. Есть ли способ избежать этого? – szymond

+0

Нет, я так не думаю, но не с этим подходом, но пробелы не должны влиять на внешний вид вашей html-страницы. –

+0

Если я не использую данные в атрибутах HTML. Тогда у меня могут быть некоторые проблемы ... – szymond

 Смежные вопросы

  • Нет связанных вопросов^_^