2

この出力が「html is empty」になるのはなぜですか?

@h = {<br />}

@h match {
  case Html("") => {html is empty}
  case _ => {html has content}
}

これは「htmlにはコンテンツがあります」と出力しますか?

@i = @{Html("<br />")}

@i match {
  case Html("") => {html is empty}
  case _ => {html has content}
}

これが私にとって重要な理由は、一般的なユースケースの最後の例 (moreScripts および moreStyles に相当するもの) では、最初のスタイルを使用して html のチャックを別のテンプレートに渡すためです。次に、そのhtmlにコンテンツがあるかどうかに基づいて切り替えたいと思います。ただし、常に Html("") に一致します。

4

2 に答える 2

3

メソッドごとに生成されるコードはわずかに異なります。

def h:play.api.templates.Html = {
  _display_(
    Seq[Any](format.raw("""<br />"""))
  )
}
def i = {{Html("<br />")}}

作成に使用される_display_メソッドは、渡された のすべての要素に対してha を実行することになりますfoldLeftSeq

これにより、次の結果が得られます。

Html("") + Html("<br />")

ケース クラスはHtml、変更可能な によってサポートされていることが判明しましたStringBuilder

case class Html(text: String) extends Appendable[Html] with Content with play.mvc.Content {
  val buffer = new StringBuilder(text)

  /**
   * Appends this HTML fragment to another.
   */
  def +(other: Html): Html = {
    buffer.append(other.buffer)
    this
  }
  override def toString = buffer.toString

  /**
   * Content type of HTML (`text/html`).
   */
  def contentType: String = "text/html"

  def body: String = toString

}

これは、 の値がtext最初Htmlの のtext値にのみ設定されることを意味します。Htmlメソッドを介して新しいを作成するときはいつでも、+変更するだけStringBuilderです。

例えば

val html = Html("1") + Html("2")
html.text == "1"
html.toString == "12"
html.body == "12"

これはtextパターン マッチングに使用される値であるため、パターン マッチングで使用する能力が事実上損なわれます。

例えば

(Html("1") + Html("2")) match { case Html("1") => "broken" } // returns "broken"
于 2012-07-14T03:19:57.340 に答える
0

たぶん文字列の一致を試してみませんか?

@h.toString() match {
  case "" => {html is empty}
  case _ => {html has content}
}
于 2012-07-12T17:16:31.097 に答える