2

accountlist.scala.html次のようなテンプレートがあります。

@(accounts: models.domain.AccountList)
@titlebar = {<p>some html</p>}
@content = {
    @for(account <- accounts) {
        <p>@account.name</p>
    }
}

@main(titlebar)(content)

...そして次のような別のテンプレートaccount.scala.html:

@(account: models.domain.Account)

@titlebar = {<p>@account.name</p>}
@content = {
    @for(transaction <- account.getTransactions()) {
        <p>@transaction.detail</p>
    }
}
@main(titlebar)(content)

それらの両方から、 template を呼び出していmain.scala.htmlます。

最初のビュー accountlist.scala.html で POJO全体にアクセスできるAccountので、詳細を表示するビューに移動するときに、サーバーを呼び出してアカウントの詳細を取得する必要はありません。クライアント側のビューを変更したいだけです。リスト内のアカウントでユーザーがクリックしたビューaccount.scala.htmlから2 番目のビューを呼び出すにはどうすればよいですか? accountlist.scala.html必要に応じてテンプレートを変更する準備ができています。

4

2 に答える 2

4

以前の回答を提供しましたが、この投稿の最後にまだあります。しかし、あなたのコメントから、それがどれほど危険であるかを理解せずに、他の何かを求めていることがわかります.

ユースケースを処理する方法は 3 つあります。最悪の方法から始めましょう。

ステートフル Web アプリケーション

何らかのデータ ソースから Pojo にデータをロードし、複数のリクエスト間で Pojo を再利用したい場合は、キャッシュなど、サーバーに何らかのクライアント状態を実装する必要があります。Web アプリケーションは長い間この方法で開発されてきましたが、これが大きなバグやエラーの原因でした。データベース内の基礎となるアカウント データが、1 つの HTTP リクエストと次のリクエストの間に更新されるとどうなりますか? キャッシュされたデータを使用するため、クライアントには表示されません。さらに、ユーザーがブラウザで戻るとどうなるでしょうか? ユーザーがナビゲーション フローのどこにいるかを追跡するために、サーバー側でどのように通知を受け取るのでしょうか? これらの理由やその他の理由から、Play! ステートレスになるように設計されています。Web アプリケーションに本当に興味がある場合は、おそらく REST アーキテクチャ スタイルとは何かについて読む必要があります。

ステートレス Web アプリケーション

ステートレス Web アプリケーションでは、2 つの HTTP リクエスト間でデータを保持することは許可されていないため、データを処理するには 2 つの方法があります。

ワンショットでユーザーインターフェースを生成

これは、アカウント データが減少した場合に使用できるアプローチです。各アカウントから必要なすべてのデータをページに埋め込み、ビューを生成します。ビューは非表示のままにし、ユーザーがクリックしたときにのみ表示します。サーバー側で HTML を生成し、JavaScript を使用して DOM の特定の部分のみを表示するか、アカウントの JSON 表現を転送し、何らかのテンプレート ライブラリを使用して必要な UI をクライアントで直接構築することができます。

必要に応じてユーザー インターフェイスを生成する

このアプローチは、アカウント データ構造に含まれる情報が多すぎて、クライアント上のすべてのアカウントのすべての情報を最初に転送したくない場合に必要になります。たとえば、ユーザーが非常に少数のアカウントの詳細のみを表示することに関心があることがわかっている場合は、ユーザーが要求したときにのみ詳細を要求する必要があります。

たとえば、アカウントのリストには、詳細と呼ばれる各アカウントに関連付けられたボタンがあり、アカウント ID を使用して新しい要求をサーバーに送信します。

@(accounts: models.domain.AccountList)
@titlebar = {<p>some html</p>}
@content = {
    @for(account <- accounts) {
        <p>@account.name <button class="details" href="@routes.Controllers.account(account.id)">details</button></p>
    }
}

クライアント側でユーザー インターフェイスを生成することもできますが、ユーザーがボタンをクリックしたときにデータ構造をサーバーから取得する必要があることに注意してください。これにより、ユーザーはアカウントの最後の利用可能な状態を確実に取得できます。


古い答え

ビューを再利用することが目標である場合、Play ビューは Scala クラスに他ならないため、インポートすることができます。

@import packagename._

そして、それを別のテンプレートで使用します。

@for(account <- accounts) {
        @account(account)
    }
于 2013-04-03T13:27:54.127 に答える
0

この質問は、プレイ フレームワーク テンプレートの誤解を明らかにしています。play プロジェクトをコンパイルすると、テンプレート コードは html、css、および javascript に変換されます。

hrefアカウント行の属性からアカウント トランザクションを表示する別のテンプレートを「呼び出す」/リンクすることはできません。ただし、次のいずれかを実行できます。

  1. すべてのアカウントからすべてのトランザクションを一度にクライアントにロードした場合: テンプレートを拡張して<div>、トランザクションを表示するアカウントごとに個別のセクションを生成します。また、JavaScript を生成して、1) 概要を非表示にし、2) 概要でアカウントの 1 つをクリックしたときにdiv特定のトランザクションを表示します。divEdmondo1984 によって提案されたノックアウト ライブラリ、または twitter ブートストラップのアコーディオンまたはタブを参照してください。
  2. サーバーからアカウントの概要のみを読み込む場合。このようなリンクを生成しhref="@routes.Controllers.account(account.id)"(Edmondo1984 の回答を参照)、別のテンプレートを作成してこのデータを表示します。

サーバーからすべてのデータを取得した場合の質問なので、オプション 1 に進みます。

于 2013-04-08T06:12:34.440 に答える