2014-01-07 58 views
1
@(css: Option[String])(content: Html)(customJS: Option[Array[String]]) 

@for(js <- customJS if !customJS.isEmpty) { 
      <script src="@routes.Assets.at(js)"></script> 
     } 

我正在写这个小的理解,将通过并打印出uri字符串。由于它可能不是,或者是一串字符串,所以我使用了Option斯卡拉奇怪的情况播放类型推断

然后来自类型安全激活器的编译器告诉我,@routes.Assets.at()应该采取String而不是Array[String]。我很震惊,因为js应该是String对不对?

然后我试着写这样的:

@for(js <- customJS if !customJS.isEmpty) { 
     @var uri = js 
      <script src="@routes.Assets.at(js)"></script> 
     } 

然后编译说,加入行是“简单表达”的非法启动。

这不是一个简单的表达!这是一个完整的理解{}!另外我最终被迫使用js.asInstanceOf[String]来欺骗编译器。我对此并不满意,因为一旦有人告诉我不应该使用asInstanceOf。那么我的原始代码有什么问题?

回答

1

请注意,您不应使用Array - 请使用Seq

有没有必要在Option[Seq[String]] - 使用Seq[String]。而不是None你总是可以使用一个空的Seq

如果你仍想使用Option[Seq[String]]你应该重写你for这样的:

@for(jsArray <- customJS; js <- jsArray) { 
    <script src="@routes.Assets.at(js)"></script> 
} 

你不需要if !customJS.isEmptyOption就像1或0元素的集合。 Option[Array[String]]的元素是Array[String]

+0

我看到了!这就是为什么!!但那个“简单表达”的非法开始呢? –

+0

@WindDweller:我猜'@ var'只是非法的陈述。我无法在[documentation]中找到它(http://www.playframework.com/documentation/2.2.x/ScalaTemplates)。你可以使用'@definition'。你也可以在'for'中添加一个额外的变量:'@for(jsArray < - customJS; js < - jsArray; otherName = js)'。 – senia

+0

Emmm ..对不起,我试图使用'Seq',但它告诉我:错误:值foreach不是对象的成员Seq –