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.htmlfoo.scala.htmlbar.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」および「sub-templates=>index.scala.html」などの使用と、メイン テンプレートにサブテンプレートを注入することを理解しました。そして、私はすでにこれを行っていると思います。invert the template flow

4

2 に答える 2

0

各テンプレートは 1 つのメソッドを持つクラスにコンパイルされます。テンプレートの呼び出しは動的ではありませんが、Scala または Java で他のメソッド/関数を呼び出すのと同じです。リフレクションを使用してこれを動的にすることは可能ですが、存在しないテンプレートを呼び出そうとしたり、個々のテンプレートのパラメーター リストと一致しないパラメーターを使用しようとすると、コンパイラ エラーが発生することを保証する静的型チェックが失われます。

この種の動的テンプレート処理 (データベース フラグで使用するテンプレートを選択する場合など) が絶対に必要なユース ケースがいくつかあるかもしれませんが、if else で行った方法、またはより簡潔に Scala スイッチ/マッチを使用する方法です。 、その特定のテンプレートが使用されたときに実行時まで失敗しないリフレクションのものとは対照的に、間違った場合にコンパイルに失敗する明示的なコードを取得するため、おそらく最適です。

個々のサブテンプレート、たとえば同じヘッダーに共通のテンプレートを適用したいだけの場合、これを行う一般的な方法は、テンプレート フローを逆にして、個々のテンプレートがコンテンツを渡す「メイン」テンプレートを呼び出すようにすることです。メイン テンプレートが共通構造に含める HTML パラメータ。

これは、新しいプロジェクトを作成するときのサンプル プレイ プロジェクト テンプレートのセットアップ方法です。したがって、それを見ることができます。index.scala.html は、共通のマークアップを含む main.scala.html を呼び出します。

于 2014-05-09T08:16:55.467 に答える
0

思い通りには使えませんが、Scala Dynamics を利用することはできます。

次のようなもので、Dynamic scala trait を拡張するクラスを作成します。

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")
于 2014-05-07T12:51:14.367 に答える