Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Play Framework 2.2.2(Scala)中动态更改(@main)名称_Scala_Playframework 2.2_Scala Template - Fatal编程技术网

在Play Framework 2.2.2(Scala)中动态更改(@main)名称

在Play Framework 2.2.2(Scala)中动态更改(@main)名称,scala,playframework-2.2,scala-template,Scala,Playframework 2.2,Scala Template,我试着让游戏布局更具动态性,但不知道该怎么做,有什么帮助吗 我的问题是: index.scala.html 内部视图->模板->main.scala.html、foo.scala.html、bar.scala.html 我不是说我需要动态地创建整个“主布局”,而是动态地获取名称。能做到吗 我试着像下面这样做,但我需要知道每个模板的名称,任何建议 index.scala.html 我想我没有正确解释我的问题: @约翰南德伦 看来有些误会。是的,我现在明白了,如果不使用反射,我不允许动态地给出模板名

我试着让游戏布局更具动态性,但不知道该怎么做,有什么帮助吗

我的问题是:

index.scala.html

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

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

我试着像下面这样做,但我需要知道每个模板的名称,任何建议

index.scala.html

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

@约翰南德伦 看来有些误会。是的,我现在明白了,如果不使用反射,我不允许动态地给出模板名称,而且它似乎也有它自己的缺点,这要感谢你和来自控制器的@Khanserf,而我从来没有打算这么做

但是,正如您所说,如果您只想在单个子模板周围应用公共模板,我主要关心的是,我不会有公共模板,正如您所述,实际上是基于用户=>不同的主模板。是的,我可以使用开关/外壳,但我需要知道*模板名称,并在每个子模板上硬编码


是的,我已经了解了templates->main.scala.html和sub-templates=>index.scala.html等的用法。。。。以及在主模板上注入子模板。我想我已经在做这件事了,反转模板流。

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

创建一个扩展动态scala特性的类,如下所示:

object DynamicTemplates extends scala.Dynamic{
    def applyDynamic(methodName:String)(someParam:String) ={
        if(methodName == "foo") templates.foo(someParam)
        else whatever
    }
}
这样,您可以做两件事:

DynamicTemplates.foo("someParam")


每个模板通过一个方法编译成一个类,调用该模板不是动态的,而是像调用Scala或Java中的任何其他方法/函数一样。使用反射实现此动态是可能的,但如果尝试调用不存在的模板或使用与单个模板的参数列表不匹配的参数,则会丢失静态类型检查,从而确保会出现编译器错误

在某些用例中,您可能绝对需要这种动态模板处理,例如选择要与数据库标志一起使用的模板,但使用if-else或更简洁地使用Scala开关/匹配的方式可能是最好的,因为如果执行错误,显式代码将无法编译,与反射不同的是,反射在运行时使用特定模板之前不会失败

如果您只想在单个子模板(例如,相同的标题)周围应用公共模板,那么实现这一点的常用方法是反转模板流,以便每个单个模板将调用一个主模板,并将其内容作为HTML参数传递,主模板将包含在公共结构中


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

请您解释一下您正在做什么,因为我不明白为什么要这样做,scala新手,抱歉!!实际上,我在选择main.scala.html时需要动态功能,而不是在这一行中选择Okviews.templates.mainfoos。你不能随心所欲地使用它,这不是我试图做的,在scala模板中根本不可能???@mane在scala中,你不能像在php或javascript中那样使用基于字符串的元动态方法调用。然而,Scala给了您动态特性,允许您在类上调用不存在的方法,就像它实际上是在那里定义的一样。而不是像php$obj->{$methodName}$arg1、$arg2、$arg3;在scala中,您可以选择obj.selectDynamicmethodNamearg1、arg2或obj.methodNamearg1、arg2,但除非使用第一种形式,否则不能使用字符串动态调用该方法。详细信息:请查看编辑过程。我想我最好使用switch/match,我可以试着重复使用switch和match语句,创建一些片段或标记,或者其他任何播放提供的东西。因为每个模板都只是一个函数,应该能够处理您认为属于片段/标记的任何逻辑,您可以轻松创建只是普通逻辑的模板。创建常规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")