【问题标题】:Variable within scala template in play framework播放框架中的scala模板中的变量
【发布时间】:2011-07-06 08:30:36
【问题描述】:

我需要能够声明变量,然后在一些标记之后我 需要参考它们。为了实现这一点,这是 我的 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

【问题讨论】:

  • 不是一个答案,而是一个提示:签入 tmp/,从您的模板生成的 scala 代码存在于那里(在一个子目录中 - 我没有方便检查的 Scala 项目)。通常有助于了解幕后究竟发生了什么:)

标签: scala playframework


【解决方案1】:

我很好奇,所以做了一些挖掘。请参阅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 有什么期望:)

【讨论】:

  • 也许它比这个答案更新,但现在 Play 中有一个“定义”函数可以做到这一点。
【解决方案2】:

你可以只使用 for 理解:

@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 &lt;- List(1); &lt;declare variables&gt;){&lt;html here&gt;}

【讨论】:

    猜你喜欢
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    • 2013-05-10
    • 1970-01-01
    • 1970-01-01
    • 2014-04-18
    • 2014-05-03
    相关资源
    最近更新 更多