play框架中的scala模板中的变量

时间:2011-07-06 08:30:37

标签: scala playframework

我需要能够声明变量并在稍后标记之后我 需要参考它们。为了实现这一点,这是 我的scala模板的简化版本:

@(map1: 
java.util.LinkedHashMap[String,java.util.LinkedHashMap[String,Object]]) 
@import scala.collection.JavaConversions._ 
@import play.Logger 
@for( (key,value) <- map1) { 
    <div> 
    @{ 
       val rmap = Foo.someMethod(value) 
       val baz = rmap.getOrElse("baz", null) 
    <table border="0"  cellpadding="0" cellspacing="0"  > 
    <tbody> 
    <tr> 
      <td rowspan="3"> 
        <div class="bar"> 
          @baz 
        </div> 
      </td> 
    </tr> 
    </tbody> 
  </table> 
  } 
  </div> 
} 

上面是有效的scala模板,如果不是,我怎么能声明baz和 稍后在标记中引用它? 我使用的是1.2.2RC2和scala 0.9.1

2 个答案:

答案 0 :(得分:8)

我很好奇所以做了一些挖掘。见https://groups.google.com/forum/#!topic/play-framework/Mo8hl5I0tBQ - 目前没有办法,但展示了一个有趣的解决方法。定义utils / Let.scala:

package utils
Object Let {
    def let[A,B](a:A)(f:A=>B):B = f(a)
}

然后

@import utils.Let._

@let(2+3){ answer =>
   @answer <hr> @answer
}

这是一种非常实用的处理方式,但是,你在Scala中的期望是什么:)

答案 1 :(得分:3)

你可以用一个来理解:

@for( (key,value) <- map1;
     rmap = Foo.someMethod(value);
     baz = rmap.getOrElse("baz", null)
) { 
<div> 
  <table border="0"  cellpadding="0" cellspacing="0"  > 
    <tbody> 
      <tr> 
        <td rowspan="3"> 
          <div class="bar"> 
            @baz 
          </div> 
        </td> 
      </tr> 
    </tbody> 
  </table> 
</div> 
} 

...如果你没有任何东西需要循环,你可以说@for(i <- List(1); <declare variables>){<html here>}