【问题标题】:How to define a tag with Play 2.0?如何使用 Play 2.0 定义标签?
【发布时间】:2011-10-27 10:07:31
【问题描述】:

关于 Play 2.0 模板引擎的文档并不多。

如何使用 Scala 模板创建标签?

【问题讨论】:

    标签: scala tags playframework playframework-2.0


    【解决方案1】:

    play 2.0 中的模板引擎直接来自 play 1.0 scala 模块。如果您仍然想知道像 Scala 这样的函数式语言能给图片带来什么好处,那么这肯定是它的亮点之一。

    演示:

    在 Scala 语法中,标签只不过是一个函数调用。有趣的是,html 片段本身被视为函数,允许最强大的替换构造。

    让我们定义一个名为 mytag.scala.html

    的 html 页面

    文件: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>
        }    
    }
    

    上面的标签采用 2 个不同参数组中的 3 个参数:

    1. 一个级别,由一个字符串表示(默认为“error”)
    2. 索引
    3. 最后是一个名为 body 的函数,它接受一个字符串参数并返回 HTML 代码。请注意,body 是在其自己的参数组中定义的。它相当于我们在 j2ee 中所知道的 jsp 片段

    现在让我们看看如何使用这个标签:

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

    在我们可以使用标签(或函数)之前,我们需要让 Play 知道它的位置:这就是 import 语句的目的。请注意,标签文件的位置(路径)无关紧要,只要您调整导入位置,就像使用 Java 包一样。

    遵循调用本身,这很简单。但是请注意,我们将参数化的 html 片段传递给标记。

    有关更多详细信息,您可以在URL 找到 scala 模板文档

    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>
      

      【讨论】:

      • 我真的不知道,还不是 scala 专家。看起来是一个关于 SO 的好问题。
      • 我应该尽快重试play2.0。上次,对我的实验来说真的太生了!我还不是 Scala 专家,但我学到了很多东西,而且它是迄今为止唯一让我觉得我最终肯定可以关闭 Java 的语言 ;)
      • 在这种情况下,如果 level 不是成功、警告或错误,您将有一个带有该 css 类的 p 标签,它可能不会被缩进。在@Olivier Refalo 的回答中,只有当它匹配其中一个错误级别时才会打印 P 标签。
      • 实际上,如果它不是这 3 个值之一,它就是一个 MatchError - 正如写的那样,这个标签坚持传入一个有效的“级别” - 你的方法更好。
      【解决方案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>
        }
      
      }
      

      现在让我们从另一个模板中使用它:

      @import 标签。_
      @notice("error") { color => 糟糕,出了点问题 }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-17
        • 1970-01-01
        • 2016-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-07
        • 2012-04-16
        相关资源
        最近更新 更多