2010-05-11 4 views
1

У меня есть adobe flex datagrid с простым пользовательским ярлыком itemrenderer в одном из столбцов. Нажатие на itemrenderer запускает событие cairngorm, что приводит к выполнению служебного вызова, а данные из вызова службы заполняют TitleWindow.Adobe 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

Мне очень нравится этот метод, потому что я могу расширить его до всех вызовов службы. Я создал привязываемый SingleMonel ServiceModel, который хранит метод lastTime, метод и службу каждый раз, когда выполняется вызов службы. Затем я изменил baseDelegate, чтобы проверить параметры ServiceModel (lastTime, method, service) на текущий вызов службы - если это тот же метод и имя службы, а время меньше 500 мс, тогда не обрабатывайте его. Есть ли у вас какие-либо проблемы с этим? – JonoB

+0

@JonoB, это может быть проблемой, если есть законная причина для вызова одного и того же метода обслуживания в цикле. Сравните это с тем, что пользователь имеет законную причину, чтобы щелкнуть ссылку несколько раз в течение 250 мс, и кажется, что делать это на обработчике событий было бы лучше. –

+0

В моем приложении нет событий, имеющих один и тот же вызов службы от одного и того же клиента в течение 250 или 500 мс. Если есть, то это, вероятно, ошибка! В цикле, безусловно, нет вызовов службы. У меня также есть эти ссылки с одним кликом во многих местах в моем приложении, и я действительно не хочу идти и создавать обработчик событий для каждого из них. – JonoB

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

Нет. ** Сначала **, это много кода для простой задачи. Упрощать. ** Второе **, 'миллисекунды' вернут текущий миллисекундный компонент, а не общие миллисекунды, и не достигнут требуемого результата. ** Третий **, 'миллисекунды' - это свойство, а не метод, поэтому нет скобок. –

0

Лучший способ сделать это, чтобы установить флаг в вашем ItemRenderer отметить, что она была нажата один раз. Это предотвращает отправку другого события 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. Таким образом, кнопка распознает второй клик, но не отправляет одно событие клика. Надеюсь, что это имеет смысл - я проверил это и работает для меня :)

Смежные вопросы