2

私はこの問題をたくさん検索しました。scala html テンプレートで変数を作成したいだけで、一時変数が必要でした。

私が見つけた「意味のある」唯一の解決策は次のとおりです。

@defining("hello text") {testvariable =>
    <h1>output of variable: @testvariable</h1>
}

それが本当に唯一の方法ですか?playframework の人たちは本気ですか?コントローラーからテンプレートに変数値を渡したくありません。単純なローカル変数を作成し、「if ブロック」でそれに値を割り当てたいだけです。

4

3 に答える 3

4

はい、Play 男子は本気だと思います。

初め。

hardcoded変数をテンプレートの要素として定義する意味は何ですか? 1つの値を何度も挿入したくないことは理解していますが、示した方法@definingで問題が解決します。一方、変数をifブロック内の条件として使用するためだけに変数を配置したい場合、それも意味がありません@if(1==1){ code }。何らかの動作をシミュレートするようなものを書くこともできるからです。controllersそれ以外の場合、変数はコントローラーによって決定される必要があります。明確にするために、変数のグループを からに渡すための Map を例として使用できますview

2番。

Play の Scala テンプレートは単なる関数です。つまり、他の関数やメソッドを呼び出すこともできます。getter例として、必要なものを実行して返す何らかのメソッドを呼び出すことができます。サンプルが多いので割愛します。

三番。

2 番目の部分で述べたように、@defining アプローチが気に入らないapp/controllers/Application.java場合は、値を保存および設定/取得するための非常に単純なメソッドをアプリのどこかに作成することができます (これは と考えてください)。もちろん、多くの「変数」を使用する予定がある場合は、それぞれに個別のゲッターとセッターを作成するのではなく、1 つのマップに格納することをお勧めします。

コントローラーで、Applicationこれらの単純なメソッドを追加するだけです(必要に応じて、他のタイプの独自のゲッターも作成します)

private static Map<String, Object> map = new HashMap<String, Object>();

// setter
public static void setValue(String key, Object value) {
    map.put(key, value);
}

// general getter would work well with String, also numeric types (only for displaying purposes! - not for calculations or comparisons!)
public static Object getValue(String key) {
    return map.get(key);
}

public static Boolean isTrue(String key) {
    return  Boolean.valueOf(map.get(key).toString());
}

public static Double getDouble(String key) {
    return Double.valueOf(map.get(key).toString());
}

次にview、マップのキーと値を設定して読み取ることで、それを使用できます

@Application.setValue("name", "Stefan")
@Application.setValue("age", 30)
@Application.setValue("developer", false)
@Application.setValue("task1", 123.5)
@Application.setValue("task2", 456.7)


<h1>ellou' @Application.getValue("name")!</h1>

<div>
    Today there are your  @Application.getValue("age") birthday!
</div>

<div>
    You are @if( Application.isTrue("developer")  ) {
        very big developer
    } else {
        just common user
    }
</div>

<div>
    Once again: @{ val status = if (Application.isTrue("developer"))  "veeeeery big developer" else "really common user"; status }
</div>

<div>
    Today you earned $ @{ Application.getDouble("task1") + Application.getDouble("task2") }
</div>


<div> etc... </div>

ご覧のとおり、いくつかの基本的な操作を実行することもできますが、より高度なタスクの場合は、重みを (単なる) テンプレート エンジンから専用コントローラーのメソッドにリダイレクトします。

于 2012-06-27T20:40:20.643 に答える
0

その例は、「コントローラーからテンプレートに変数値を渡す」ことではありません。値を変数にバインドして、後続の中かっこの範囲内で再利用できるようにします。これはまさにあなたが望むもののようです。つまり、そのコードをテンプレートで使用し、「hello テキスト」を testvariable にバインドすると、次のようになります。

<h1>output of variable: hello world</h1>

つまり、コントローラーとは何の関係もありません。

使用しようとしているテンプレート コードを投稿していただければ、お役に立てるかもしれません。

于 2012-06-27T20:24:13.453 に答える
0

ゾンビを作成して申し訳ありません...しかし、ここで自分自身を検索することになったので、私が好む代替案であるBiesiorsの2番目の代替案を詳しく説明することで貢献したいと思いました(簡単なストライプ行の例を使用):

/** This goes in the top of the scala template, before the HTML **/
@injectStripeColor(index: Integer) = @{
    if(index % 2 == 0){
        "#EEE" // Even row
    } else {
        "#AAA" // Odd row
    }
}

これで、テンプレートで使用できる関数ができました。(上記の関数を、それを必要とするテンプレートで必要なときにいつでも含める別のファイルに保存することもできます)。

/** This goes in your row loop where i is current index **/
<tr><td style="background-color: @injectStripeColor(i)"> @content </td></tr> 
于 2014-08-05T13:22:12.687 に答える