【问题标题】:Dynamically change (@main) name, in Play Framework 2.2.2 (Scala)在 Play Framework 2.2.2 (Scala) 中动态更改 (@main) 名称
【发布时间】:2014-05-07 12:13:22
【问题描述】:

我试图让 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

【问题讨论】:

    标签: scala playframework-2.2 scala-template


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 请仔细阅读编辑。而且我想我最好使用switch/match,并且我可以尝试重新使用 switch 和 match 语句,创建一些 sn-ps 或标签或其他东西,无论播放提供什么。
    • 由于每个模板“只是一个函数”(应该能够处理您赋予 sn-p/tag 的任何逻辑),您可以轻松创建只是普通逻辑的模板。创建常规的 Scala 辅助函数来执行此类操作并从模板中调用它们也是可能的,而且有时更容易。此外,如果每个用户都有一个单独的不同模板,那么可能一个更动态的模板引擎(甚至是客户端模板)对您来说可能是一个好主意。
    【解决方案2】:

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

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

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

    这样你可以做这 2 件事:

    DynamicTemplates.foo("someParam")
    

    DynamicTemplates.selectDynamic(templateName)("someParam")
    

    【讨论】:

    • 你能解释一下你在做什么吗,因为我不明白为什么要这样做,这里是 Scala 新手,对不起!!在选择 main.scala.html 时,我实际上需要动态功能,而不是在这行 Ok(views.templates.main("foos")) 中。 You can't use it like you want 不是我试图在 scala 模板中做的事情吗??
    • @mane 在 Scala 中,您不能像在 php 或 javascript 上那样使用基于字符串的“元”动态方法调用。然而,Scala 为您提供了 Dynamic trait,它可以让您在类上调用不存在的方法,就像它实际上是在那里定义的一样。而不是像在 php $obj->{$methodName}($arg1, $arg2, $arg3); 中那样在 scala 中执行 obj.selectDynamic(methodName)(arg1,arg2)obj.methodName(arg1,arg2) 但您不能使用字符串动态调用该方法,除非您使用第一种形式。更多信息:stackoverflow.com/questions/15799811/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    • 2018-12-27
    • 1970-01-01
    相关资源
    最近更新 更多