2010-11-29 66 views
1

我在想,Lift是否有一個迭代標籤(例如:for,foreach)? 當我使用JSP時,我可以輕鬆地迭代一個List,只需使用JSP,將對象傳遞給標記。類似於thislike this。 我知道這不是最好的例子,但你明白我的意圖。 總之,這是否與Lift存在,或者如果不存在,我將如何設法做這樣的事情?liftweb是否有迭代標籤?

我想要做的最後一件事是硬編碼html。

回答

10

簡而言之:No. Lift的設計嚴格地將邏輯與設計分開,並且禁止在模板標記中使用通用標籤。

查看view first article以查看lift如何處理迭代。

從文章中的一個例子:你的標記:

<table> 
    <lift:show.users> 
    <tr> 
     <td><f:first_name>David</f:first_name></td> 
     <td><f:last_name>Pollak</f:last_name></td> 
    </tr> 
    </lift:show.users> 
</table> 

您的代碼:

class Show { 
    def users(xhtml: NodeSeq): NodeSeq = 
    Users.findAll.flatMap(user => 
     bind("f", xhtml, 
     "first_name" -> user.firstName, 
     "last_name" -> user.nameName 
    ) 
    ) 
} 

現在,看到標籤<lift:show.users>呼籲與標籤的內容對應的方法時什麼提升呢作爲論據。標籤將被替換爲users方法的返回值。

users方法會遍歷所有Users,對於每個用戶,它將bind的值寫入內部xhtml的第一個和第二個名稱的值。所有這些迭代然後連接(通過flatMap)並返回。

當我開始舉起電梯時,我總是發現這種方法有點過於僵化;在這裏和那裏有一個微小的循環,怎麼可能會傷害?但現在我知道調用從模板代碼創建您自己的片段是多麼容易,我無法想象使用任何類似jsp的東西了。它比較弱,混亂你的標記。當然,你失去了很多Scala的驗證能力。

注:

的模板標籤中填充內容的原因是設計的目的。在這種情況下,將在bind期間替換虛擬變量和值。因此,模板設計人員可以使用或多或少有意義的內容來填充標籤,從而使編碼人員能夠更好地理解設計人員所考慮的語義。

+1

感謝您的解釋和快速回復。 :) – ksemeks 2010-11-29 14:57:54