2009-01-15 51 views
0

我有一個非常奇怪的問題與ItemRenderer。我有一個ViewStack的main.mxml容器。當用戶登錄時,初始視圖包含一個AdvancedDataGrid - 包含一些數據和下面的ItemRenderer - 它只是顯示一個Delete按鈕。當用戶登錄時,這個AdvancedDataGrid會自動從數據庫中刷新。應該根據用戶的角色成員資格啓用或禁用「刪除」按鈕。奇怪的ItemRenderer行爲

方案1(登錄以管理員):

  1. 管理員用戶登錄 - 數據網格視圖立即顯示和刪除按鈕是正確啓用的每一行
  2. 註銷
  3. 以非管理員用戶身份登錄 - 數據已刷新,並且所有行仍處於啓用狀態除外)。它可能是第一行,第二行或第三行 - 完全是隨機的。這真的很奇怪。 。 。

我重新啓動瀏覽器並按照方案2進行操作。 。 。

方案2(登錄在作爲非管理員):在

  • 非管理員用戶登錄 - 數據網格視圖立即顯示和刪除按鈕是正確禁用的每一行
  • 註銷
  • 以管理員用戶身份登錄 - 所有行仍然被禁用除了一個。它可能是第一行,第二行或第三行 - 完全是隨機的。與第一種情況相反。

有趣FACT--如果我把一個斷點checkDeleteSecurity,只當第一個用戶登錄並在DataGrid首先刷新達到它。當我註銷並且下一個用戶登錄時,數據網格會刷新,但checkDeleteSecurity斷點永遠不會被捕獲。

[Bindable] 
private function checkDeleteSecurity():Boolean 
{ 
    return (SecurityProxy.CheckSecurity(SecurityProxy.UserName)); 
} 

<mx:LinkButton label="Delete" click="onDeleteClick()" id="lbDelete" enabled="{checkDeleteSecurity()}"/> 

回答

2

這聽起來像你可能會在這裏發生一些事情。首先,值得注意的是ItemRenderer被重新使用;在網格(或列表等)中),例如包含10首專輯曲目的列表(每個曲目一行),當列表最初創建時,每行得到正確渲染 - 但是當底層專輯(爲擴展該示例)發生變化時,專輯曲目渲染器如果他們正確接線,他們自己只會自動響應變化。通常,這涉及壓倒一切的渲染數據setter方法:

override public function set data(value:Object):void 
{ 
    super.data = value; 

    // .. Take some action 
} 

這可能是爲什麼你CheckSecurity方法不會被調用數據的變化 - 因爲按鈕的enabled屬性到它的唯一途徑,而該按鈕已被渲染。

此外,綁定到一個函數有它自己的問題。有人昨晚居然問這個問題,(通過結合布爾函數的結果設置狀態上的一個按鈕)做得相當類似的東西,你在做什麼:

Can I bind a Flex component property to a function?

希望幫助!如果您有任何問題,我會密切留意後續評論的主題。

+0

這是我的問題。 。 。這是第2部分;) – SkunkSpinner 2009-01-15 18:20:13

0

當你的數據刷新通話lbDelete.enabled = checkDeleteSecurity()什麼,你應該做的是;這將確保每次刷新數據時都會調用安全功能。

我認爲發生了什麼事是你的組件正在創建調用安全功能,但一旦它創建,那麼沒有什麼可以更新linkbutton。

一旦創建了一個itemrender,就說它產生了6,那麼當你刷新數據時,它將使用那些已經爲下一組數據創建的6條表達式(但帶有更新的數據)。如果下一組數據需要8個itemRenderer,那麼它只需要創建另外2個渲染器。所以只有那兩個itemrenders會調用安全功能,因爲它們還沒有被創建。