我试图让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
我并不是说我需要制作整个' Main-Layout'动态但只是动态获取名称。可以吗?
我尝试过如下操作,但我需要知道每个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"和"子模板=> index.scala.html"等等......并在主模板上注入子模板。我想我已经这样做了invert the template flow
。
答案 0 :(得分: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")
答案 1 :(得分:0)
每个模板都使用一个方法编译成一个类,调用模板不是动态的,而是像调用Scala或Java中的任何其他方法/函数一样。使用反射可以实现此动态,但是如果您尝试调用不存在的模板或使用与单个模板的参数列表不匹配的参数,则会松开静态类型检查以确保您将收到编译器错误。
在某些用例中你可能绝对需要这种动态模板处理(比如你选择使用哪个模板与数据库标志一起),但是你使用if else的方式,或者更简洁地使用Scala切换/匹配,可能是最好的,因为如果你做错了就会得到无法编译的显式代码,而不是在运行时使用特定模板时不会失败的反射内容。
如果您只想在各个子模板周围应用常用模板,例如相同的标题,那么执行此操作的常用方法是反转模板流,以便每个模板都能调用“主”模板将其内容作为HTML参数传递,主模板将在公共结构中包含该参数。
这是在创建新项目时如何设置示例播放项目模板,因此您可以查看,index.scala.html将调用包含公共标记的main.scala.html。