2010-05-11 106 views
1

我有一個adobe flex數據網格,在其中一列中有一個簡單的自定義標籤itemrenderer。點擊itemrenderer會觸發一個cairngorm事件,這會導致服務調用正在進行,並且來自服務調用的數據將填充TitleWindow。Adob​​e Flex預防雙擊

儘管我已將doubleClickedEnabled屬性設置爲false,但仍有可能雙擊項目渲染器,導致進行兩個服務調用,並顯示兩個TitleWindows。在其他情況下,三重點擊似乎也會觸發不良結果。

有什麼方法可以防止這種行爲?

回答

2

跟蹤您何時獲得點擊事件,並且如果您在一定時間(250毫秒)內獲得兩個,則忽略第二個。

var lastTime:Date = new Date(0); 

function OnClickHandler(event:Event):void { 
    if ((new Date()).time - lastTime.time < 250) { 
     return; 
    } 
    lastTime = new Date(); 
    ... 
} 
+0

我真的很喜歡這種方法,因爲我可以將它擴展到所有服務調用。 我創建了一個可綁定的ServiceModel單例,每次進行服務調用時都會存儲lastTime,方法和服務。 然後,我修改了baseDelegate以檢查當前服務調用的ServiceModel參數(lastTime,method,service) - 如果它的方法和服務名稱相同,且時間小於500ms,則不處理它。 你是否對此有任何疑問? – JonoB 2010-05-11 22:32:00

+0

@JonoB,如果有一個合法的理由在一個循環中調用同一個服務方法,這可能是一個問題。將這與用戶有合理理由在250ms內多次點擊一個鏈接相對比,看起來在事件處理程序中這樣做會更好。 – 2010-05-12 02:43:01

+0

在我的應用程序中沒有發生過在250或500毫秒內從同一客戶端進行相同服務調用的情況。如果有,那麼它可能是一個錯誤!循環中肯定沒有服務調用。我在我的應用程序的很多地方也有這些單擊鏈接,並且不會真的想去爲它們中的每個創建一個事件處理程序。 – JonoB 2010-05-12 08:17:18

0
// class variable section 
var lastTime:Date = null; 

... 

function handler(evt:Event):void{ 
    var currentTime = new Date(); 
    if (lastTime === null){ 
     lastTime = currentTime; 
    } else { 
     var diff = currentTime.milliseconds() - lastTime.milliseconds(); 
     if (diff <= 250) // try some other intervals to get best result for you. 
      return; 
     else 
      lastTime = currentTime; 
    } 
    ... the rest of your code. 
} 
+0

沒有。 **第一**,這是一個簡單的任務很多代碼。簡化。 ** Second **,'毫秒'將返回當前毫秒分量,而不是總毫秒數,並且不會達到所需結果。 **第三**,「毫秒」是一個屬性,而不是方法,所以沒有括號。 – 2010-05-11 16:06:33

0

做到這一點,最好的辦法是設置一個標誌,在你的itemRenderer要注意,它已被點擊一次。這可以防止它發送另一個cairngorm事件,直到返回第一個cairngorm事件的結果,此時您重置標誌,使其再次被點擊。

爲簡潔起見,下面的代碼假定一切都在同一範圍內發生。如果不是,你必須從其他上下文中發送和接收來自itemRender的事件。

[Bindable] 
var _clickEnabled:Boolean = true; 

private function doClickStuff() : void { 
    if (_clickEnabled) { 
    // fire your event 
    _clickEnabled = false; 
    } 
} 

private function onEventReturnHandler(event:Event) : void { 
    // do whatever it is you're going to do 
    _clickEnabled = true; 
} 
0

一個簡單的解決方案,將工作,以防止雙擊從發送兩個服務電話是使雙擊並有雙擊事件調用相同的處理器爲單單擊事件。

<s:Button label="Button" 
      click="clickHandler()" 
      doubleClick="clickHandler()" 
      doubleClickEnabled="true" /> 

當然,這並不能防止三重點擊,但這是一個不太常見的問題。

2

好吧,我知道這是舊的,但最簡單的方法來防止雙擊事件是爲該按鈕設置doubleClickEnabled = "true",並且不將任何函數分配給doubleClick事件。因此,該按鈕可以識別第二次點擊,但不發送單擊事件。希望它是有道理的 - 我已經測試了這個,併爲我工作:)