2011-12-01 49 views
0

我正在寫跟蹤它有多少時間被調用,以生成唯一ID的元素標籤:當再次調用相同的Play模板時變量的作用域如何?

%{ 
    try { 
     coolTagId++; 
    } catch (Exception) { 
     coolTagId = 0; 
    } 
}% 
<div id='cool-tag-${coolTagId}'></div> 

... 

$('#cool-tag-${coolTagId}').click(function(){alert("Cool Tag ${coolTagId} clicked")}); 

當我包括一個頁面此標記多次,讓我吃驚,我發現每次評估時coolTagId都是0。這是爲什麼發生?

(我將使用某種形式的UID在此之前,我只是想知道爲什麼上面的代碼不工作)

回答

2

我不知道爲什麼是但它不」不要驚訝我。 Play是一個無狀態的框架,所以看起來很自然,它不會在相同標籤的兩個實例之間共享狀態。

有趣的是,即使使用#{set coolTagId:0 /}事先設定值也不起作用。

然而,工作是什麼在標籤中設置值。把它放在你的標籤的末尾:#{set coolTagId:coolTagId /}。這樣您手動將值推送到基本模板。

1

這是一個簡單的範圍問題。

想象一下,在純Java中寫這個,標籤有效地調用了一個方法。在你的標籤(即方法)中定義的所有內容都在本地範圍內定位到該標籤,所以一旦標籤被執行,它就不會存在,因爲它已經離開了範圍。

原因是爲了確保標籤外的任何內容都不會因執行標籤而被破壞或修改。除了傳遞的參數外,所有內容都是自包含的。

+0

提醒我在WebObjects中,組件之間同步變量時存在一種不太簡單的機制。此行爲在默認情況下處於啓用狀態,而使組件高效的第一步是手動管理同步,或者更好地將它們轉換爲無狀態組件。 –

相關問題