【问题标题】:how to setup a for loop inside if statement with correct syntax Play framework Scala Template如何使用正确的语法在 if 语句中设置 for 循环播放框架 Scala 模板
【发布时间】:2015-04-26 13:24:10
【问题描述】:

我正在尝试在 scala 模板中设置一个变量。遍历用户拥有的角色,如果发现用户是客户,则对输入进行处理。如果没有,请执行其他操作。

但 scala 没那么简单,它不会在下面的代码上编译。

@var = @{ if(user != null){
    @for(role <- user.roles.filter(_.getName()=="customer")) {
        var=@customer(input)
    }
}
}

@if( var == null){
   var=@others(input)
}

它给了我两个错误

t.scala.html:275:: identifier expected but 'for' found.
[error]         @for(role <- user.roles.filter(_.getName()=="customer")) 

t.scala.html:278: expected start of definition

另外,有没有更好的方法在 scala 中做到这一点?谢谢

我的参考:Scala template set variable

更新: 我的目标是尝试做类似下面的事情,但是在 scala 模板中:

result=null
for role in User.roles:
    if(role == "customer"):
        result=customer(xyz)
        break
if(result==null):
    result = others(xyz)

【问题讨论】:

  • 首先,你不能在这样的旋转模板中分配 vals 和 vars。
  • 我正在尝试破解,我阅读了一些 stackoverflow 帖子,他们说可以像这样分配变量吗?参考:stackoverflow.com/questions/13631861/…

标签: scala playframework playframework-2.3


【解决方案1】:

要在 Scala 模板中的 if 语句内设置 for 循环,您无需分配变量。您可以在要显示内容的模板中简单地使用if 块。例如

@if(user != null) {
    @for(role <- user.roles.filter(_.getName()=="customer")) {
        @customer(input)
        @* Do other stuff related to 'role' and 'input' here *@
    }
} else {
    @* Do something else *@
}

如需进一步参考,我鼓励您查看documentation for Play templates。如果你真的想定义一个变量,你可以使用 defining 帮助器:

@defining(user.getFirstName() + " " + user.getLastName()) { fullName =>
    <div>Hello @fullName</div>
}

除了定义变量之外,您还可以定义一个可重复使用的块,这可能对您的情况有用。例如,

@customer_loop(input: String) = {
    @if(user != null) {
        @for(role <- user.roles.filter(_.getName()=="customer")) {
            @customer(input)
            @* Do other stuff related to 'role' and 'input' here *@
        }
    } else {
        @* Do something else *@
    }
}

【讨论】:

  • 谢谢,但这比我的目标有点偏移。你能看看我上面的伪代码吗?谢谢
  • @runco​​de result 是您的某个模型的某个属性吗?还是只是视图模板中使用的局部变量?
  • 是的,结果只是视图模板中的一个局部变量
  • 我知道这可能不是您要寻找的答案,但是您在上面添加的代码看起来不像是视图中的内容。 Play 和 Rails 等 Web 框架的最佳实践通常鼓励您将逻辑排除在视图之外。也许最好将该功能抽象为一个辅助方法,然后您可以从您的视图中调用它?
【解决方案2】:

声明一个变量做

@import scala.Any; var result:Any=null //where Any is the datatype accoding to your requirement

要重新分配它的值,做

@{result = "somevalue"}

所以解决方案符合你提供的伪

@import java.lang.String; var result:String=null
@import scala.util.control._;val loop = new Breaks;

 @loop.breakable {
     @for(role <- roleList) {

         @if(role.equals("customer")) {
             @{
                 result = "somevalue"
             }

             @{loop.break};

         }
     }
 }

  @if(result==null){
      @{result="notfound"}
  }

同时检查Similar1,Similar2

【讨论】:

    猜你喜欢
    • 2019-02-07
    • 1970-01-01
    • 2015-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    相关资源
    最近更新 更多