【发布时间】:2017-07-03 22:21:25
【问题描述】:
我正在尝试按照 Play documentation 制作自定义模板格式(在 Play 2.5_ 和 _Scala 2.11.11),但我在这里这意味着它不适合我。
我希望新模板的文件扩展名为“stream”(如 this video,现在已经有几年了)所以我按照文档的建议创建了这个文件:
package ui
import akka.NotUsed
import akka.stream.scaladsl.{Source}
import play.twirl.api._
import scala.collection.immutable
case class HtmlStream(source: Source[Html, NotUsed]) extends Appendable[HtmlStream] {
def +=(other: HtmlStream): HtmlStream = andThen(other)
def andThen(other: HtmlStream): HtmlStream = HtmlStream(source.merge(other.source))
}
object HtmlStream {
def apply(text: String): HtmlStream = apply(Html(text))
def apply(html: Html): HtmlStream = HtmlStream(Source.single(html))
}
object HtmlStreamFormat extends Format[HtmlStream] {
def raw(text: String): HtmlStream = HtmlStream(text)
def escape(text: String): HtmlStream = raw(HtmlFormat.escape(text).body)
override def empty: HtmlStream = ???
override def fill(elements: immutable.Seq[HtmlStream]): HtmlStream = ???
}
并将其添加到 build.sbt 文件中:
TwirlKeys.templateFormats += ("stream" -> "ui.HtmlStreamFormat.instance")
我看不到在哪里或如何包含以下隐式(在前面提到的 Play documentation - 在底部);这可能是问题所在:
Play 可以为任何类型 A 的值编写 HTTP 响应正文 它存在一个隐含的 play.api.http.Writeable[A] 值。所以你们所有人 需要为您的模板结果类型定义这样的值。为了 例如,这里是如何为 HTTP 定义这样的值:
implicit def writableHttp(implicit codec: Codec): Writeable[Http] =
Writeable[Http](result => codec.encode(result.body), Some(ContentTypes.HTTP))
当我尝试创建一个新的 view 文件时,例如称为test.scala.stream 它不知道它应该是什么类型,所以看起来肯定有问题。这个需要帮助!
【问题讨论】:
标签: scala model-view-controller types playframework customization