0

我试图使 Play 布局更加动态,但不知道如何,有什么帮助吗?

我的问题是这样的:

index.scala.html

@(title: String,templateName:String) // templateName is data obtained from a db src,  

@templates.(@templateName)(title,templateName){ // I wanted to put value of templateName after @template.****, so that template names get set at compile time, but of course it gives out errors
}

内部视图->模板-> main.scala.html, foo.scala.html,bar.scala.html

我并不是说我需要动态地制作整个“主布局”,而是动态地获取名称。能做到吗??

我试着像下面那样做,但我需要知道每一个templates name,任何建议

index.scala.html

@(title: String,templateName:String)

@if(templateName == "foo"){
    @templates.foo(title,templateName){
    }
}
else if(templateName == "bar"){
    @templates.bar(title,templateName){
} else {
    ......
}

我想我没有正确解释我的问题

@johanandren 好吧,似乎有些误解。是的,我现在明白了,我不能从控制器动态地 (if reflection isn't used, and it seems to have its own cons as well,thanks to you and @Khanser)给出模板名称,而我从来没有打算这样做。

但是就像您所说的“如果您只想在您的各个子模板周围应用通用模板”,我主要担心的是我不会有一个通用模板,正如您所说,实际上基于用户 => 不同的主模板。是的,我可以将开关/案例用于我的目的,但我需要知道 * 模板名称并将它们硬编码在每个子模板上​​。

是的,我已经理解了“templates->main.scala.html”和“sub-templates=>index.scala.html”等的使用……以及在主模板上注入模板。而且我想我已经这样做了。invert the template flow

4

2 回答 2

0

您不能随心所欲地使用它,但是您可以使用 Scala Dynamics。

创建一个扩展 Dynamic scala 特征的类,如下所示:

object DynamicTemplates extends scala.Dynamic{
    def applyDynamic(methodName:String)(someParam:String) ={
        if(methodName == "foo") templates.foo(someParam)
        else whatever
    }
}

这样,您可以执行以下两件事:

DynamicTemplates.foo("someParam")

或者

DynamicTemplates.selectDynamic(templateName)("someParam")
于 2014-05-07T12:51:14.367 回答
0

每个模板都使用一种方法编译成一个类,调用模板不是动态的,但就像调用 Scala 或 Java 中的任何其他方法/函数一样。使用反射可以使这种动态化,但是如果您尝试调用不存在的模板或使用与单个模板的参数列表不匹配的参数,您将失去静态类型检查,以确保您将获得编译器错误。

在某些用例中,您绝对需要这种动态模板处理(例如,如果您选择使用哪个模板与数据库标志一起使用),但您使用 if else 的方式,或者更简洁地使用 Scala 开关/匹配, 可能是最好的,因为如果你做错了,你会得到将无法编译的显式代码,而不是在使用该特定模板时直到运行时才会失败的反射内容。

如果您只想在您的各个子模板周围应用通用模板,例如相同的标头,那么执行此操作的常用方法是反转模板流,以便每个单独的模板将调用“主”模板,并将其内容传递为主模板将包含在通用结构中的 HTML 参数。

这是在创建新项目时设置示例播放项目模板的方式,因此您可以查看,index.scala.html 将调用包含公共标记的 main.scala.html。

于 2014-05-09T08:16:55.467 回答