首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala/Twirl变量和范围/定义

Scala/Twirl变量和范围/定义
EN

Stack Overflow用户
提问于 2017-01-06 11:44:54
回答 2查看 1.2K关注 0票数 1

我是行业的先驱,但我被要求跳到Scala项目,该项目利用了Play框架,因此包括Twirl。我正在尝试创建一个模板,它根据传入的字符串显示稍微不同的输出。

这是我的代码:

代码语言:javascript
复制
@(status: String)(implicit messages: Messages)

@{
    if(status == "00") {
        val pageTitle = "Page title"
        val appStatus = "className"
        val title = "message"
        val subTitle = "message"
        val step1Status = "className"
        val step2Status = "className"
        val step3Status = "className"
        val image1 = "/customs/assets/images/image.png"
        val image2 = "/customs/assets/images/image.png"
        val image3 = "/customs/assets/images/image.png"
        val optionalHeading = ""
        val optionalParagraph = ""
        val listContents = "<li>@Messages('message')</li><li>@Messages('message')</li>"
        val optionalLink = "<br /><a class='button' href='@routes.DashboardController.display(custom)' role='button'>@Messages('message')</a>"
    }

    if(status == "01") {
        //Other variables
    }
    if(status == "04") {
        //Etc...
    }
}

@layout(${pageTitle}) {
        <div class="content__body">
            <div class="hero">
                <div class="${appStatus}">
                    <h1 class="bold-large">@Messages(${title})</h1>
                    <p>
                        ${afterSubTitle}
                    </p>
                    <ol class="appstatus-steps">
                        <li><span class="${step1Status}"><img alt="Complete" title="Complete" src=" + ${image1} + ">@Messages("messages.Received")</span></li>
                        <li><span class="${step2Status}"><img alt="Complete" title="Complete" src=" + ${image2} + ">@Messages("messages.Processing")</span></li>
                        <li><span class="${step3Status}"><img alt="Complete" title="Complete" src=" + ${image3} + ">@Messages("messages.Decision")</span></li>
                    </ol>
                </div>
            </div>

            ${optionalHeading}
            ${optionalParagraph}

            <h2>@Messages("messages.next")</h2>

            <ul class="list list-bullet">
                ${listContents}
            </ul>

            ${optionalLink}
        </div>
    }

因此,正如您所看到的,这个页面是用代码(status)调用的,并且基于该字符串定义了许多变量,这些变量改变了页面的形成方式;内容/css类/图像等等。

这不起作用(你可能会惊讶地发现!)

但我真的不清楚为什么不知道。我认为您使用${Variable}格式访问变量,但可能应该使用@Variable格式。

即使我试图将它们更改为@Variable方式,我仍然会遇到一些问题,并且我不太明白这与Scala/Twirl中的范围有关,还有一个可以使用的“定义”关键字。我看过一些文件,但我不明白。

有人能解释一下这件事吗?

编辑

好的,让我们来考虑下面的代码:

代码语言:javascript
复制
@(status: String)(implicit messages: Messages)

@{
    if(status == "00") {
        val myClass = "custom-class-1"
    }
    if (status == "01") {
        val myClass = "custom-class-2"
    }
@layout("page title") {
    <div class="@myClass">This is a div</div>
}

因此,“我想做的一切”:)能够根据状态定义各种变量,然后在页面模板中使用这些变量。

这有意义吗?我对Scala太陌生了,所以元组/定义在我身上消失了,但我正在学习!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-08 16:04:28

@pedrorijio的回答几乎是完全正确的,但对我起作用的实际代码是:

代码语言:javascript
复制
@myClass = @{status match {
  case "00" => "custom-class-1"
  case "01" => "custom-class-2"
}}

谢谢你的帮助!

票数 1
EN

Stack Overflow用户

发布于 2017-01-06 13:25:57

您似乎更习惯于javascript变量和作用域:)

在Scala和Twirl中,如果只在if语句中定义一个变量(在本例中是一个值,因为它是不可变的),则该值只能在if块中访问。

一种解决方案可以是让if语句返回包含所有变量的元组,并使用赋值操作的威力,例如:

代码语言:javascript
复制
val (myA, myB, myC) = if(something) {
 val a = "a"
 val b = "b"
 val c = "c"

 (a,b,c) // this will return the 3 variables/values because if statements are an expression, and expressions return something
} else {
 val a = "A"
 val b = "B"
 val c = "C"

 (a,b,c)
}

// now you have a,b,c defined in this scope and you can do whatever you need with them

如果希望根据if语句返回不同的变量,则会有更多复杂情况。一种解决方案是使不需要的变量nullOption

如果你还需要更好的解释,请告诉我:)

编辑:小型化编辑示例的解决方案

我这里没有任何东西可以检查它是否编译,但是应该是这样的:

代码语言:javascript
复制
@(status: String)(implicit messages: Messages)

@{
    val myClass = if(status == "00") {
        "custom-class-1"
    } else if (status == "01") {
        "custom-class-2"
    } else {
      ""
    }

@layout("page title") {
    <div class="@myClass">This is a div</div>
}

使用模式匹配的替代

将if/with语句替换为:

代码语言:javascript
复制
val myClass = status match {
          case "00" => "custom-class-1"
          case "01" => "custom-class-2"
          case _ => ""
        }

( case _就像“在其他情况下”)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41505006

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档