2013-04-03 83 views
2

我有一個模板accountlist.scala.html看起來像這樣:如何從Play Framework中的其他模板調用模板?

@(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) 

從他們兩個我調用模板main.scala.html

我可以在第一個視圖accountlist.scala.html中訪問整個Account POJO,所以當我進入視圖時,我確實沒有必要調用服務器來獲取帳戶的詳細信息。顯示細節。我只想改變客戶端的看法。我怎麼能從用戶點擊列表中的一個帳戶的視圖accountlist.scala.html中調用第二個視圖account.scala.html?我準備好根據需要更改模板。

回答

0

這個問題揭示了玩框架模板的誤解。編譯播放項目時,模板代碼將轉換爲html,css和javascript。

你不能「援引」 /鏈接顯示從您的賬戶行的href屬性的賬戶交易另一個模板。但是,你可以做以下任一:

  1. 如果您已加載所有帳戶給客戶的所有交易一氣呵成:擴展模板來生成單獨的<div>部分每個賬戶顯示的交易。還生成JavaScript來1)隱藏總覽div和2)在概述其中的一個帳戶,當點擊顯示特定的事務div。請參閱Edmondo1984提出的淘汰賽庫或twitter引導中的手風琴或選項卡。
  2. 如果你只加載來自服務器的帳戶概況。生成一個這樣的鏈接href="@routes.Controllers.account(account.id)"(請參閱Edmondo1984答案)並創建另一個模板來查看此數據。

由於問題涉及在其中得到了來自服務器的所有數據的情況下,通過選擇1

4

我已經提供了一個以前的答案,這仍然可以在這篇文章的末尾。從你的意見,但是我明白,你要求別的東西,但不知道它有多危險。

處理您的用例有三種方式,讓我們從最糟糕的一個開始。

有狀態的Web應用程序

如果您已經從一些數據源加載數據到一個POJO,你想重新使用POJO的多個請求之間,你正在嘗試做的是執行某種在服務器上的客戶端狀態,如緩存。長期以來,Web應用程序已經以這種方式發展,這是重大錯誤和錯誤的根源。如果數據庫中的基礎帳戶數據在一個http請求和以下內容之間更新,會發生什麼情況?你的客戶端不會看到它,因爲它使用緩存數據。另外,當用戶在他的瀏覽器中執行後退時會發生什麼?如何在服務器端得到通知,以便跟蹤用戶在導航流中的位置?出於這些和其他原因,Play!被設計爲無狀態如果您真的進入Web應用程序,您可能需要閱讀什麼是REST架構風格。

一個無狀態的Web應用程序

在無狀態的Web應用程序,不允許兩個HTTP請求之間保持數據,所以你有兩種方法來處理:

生成用戶界面在一個鏡頭中

這是您可以在您的帳戶數據減少時使用的方法。您將來自每個帳戶的所有必要數據嵌入到您的頁面中,並生成隱藏的視圖,並僅在用戶單擊時顯示。請注意,您可以在服務器端使用JavaScript生成HTML,使只有你的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> 
    } 
} 

請注意,您還可以生成客戶端上的用戶界面,但你仍然需要當用戶點擊按鈕,從服務器檢索的數據結構。這將確保用戶檢索帳戶的最後可用狀態。


老答案

如果你的目標是重複使用您的看法,玩的觀點是什麼!那麼Scala類,因此你可以導入它們:

@import packagename._ 

,然後你在使用它另一個模板:

@for(account <- accounts) { 
     @account(account) 
    } 
+0

去如果我做這樣的,其結果將是所有帳戶交易明細重複列表。我試圖實現的是爲用戶提供兩個單獨的視圖:1.帳戶名稱列表。 2.給定賬戶的交易清單。我想從第一個視圖創建鏈接,以便用戶可以打開第二個視圖,但我不希望僅僅爲了顯示事務而調用服務器。 – nize

+1

在這種情況下,您將不得不使用一些客戶端模板和一些客戶端庫。看看淘汰賽 – Edmondo1984

+0

哎呀,淘汰賽看起來很有趣,但我希望能夠使用一些簡單的HTML,JavaScript或玩框架模板來解決問題。你不知道有什麼聰明的方法來做到這一點?看起來好像我有一個簡單而普遍的需求,應該有一些簡單的解決方案:)。 – nize

相關問題