Flexlib scheduleViewer .. как обрабатывать клики по элементам - PullRequest
2 голосов
/ 14 апреля 2011

Я пытаюсь использовать программу просмотра flexlib в своем приложении.

Я хочу, чтобы при нажатии на запланированное событие оно вызывало функцию в моем приложении.Основное приложение (которое позволит мне редактировать событие).Но, похоже, что нет никакой специальной функции для чего-то подобного этому, встроенной в класс, т.е. нет события, отправляемого, когда я нажимаю на событие.

Я могу использовать функцию «щелчка», чтобы обнаружить, что элемент имеетнажали на .. и попробовали что-то вроде этого:

         private function exerciseClickHandler(event:MouseEvent):void{
            if (exerciseSeries.selectedItem != null){
                //code

            }
        }

     <code:ScheduleViewer id="exerciseSeries" click="exerciseClickHandler(event)" />

Этот метод не очень надежен, потому что если он работает только в первый раз .. после выбора элемента он остается выбранным, поэтому все последующиещелчки по элементу удовлетворяют условию.

Есть ли способ определить, было ли нажатие на событие?

Или мне нужно расширить компонент и добавить какое-то clickEvent, когдасобытие кликнуло.

Ответы [ 3 ]

3 голосов
/ 23 апреля 2011

Так как упражнениеClickHandler срабатывает при нажатии на компонент, не будет ли это работать?

Вместо

private function exerciseClickHandler(event:MouseEvent):void{
     if (exerciseSeries.selectedItem != null){
          //code
     }
}

write

private function exerciseClickHandler(event:MouseEvent):void{
     switch (exerciseSeries.selectedItem)
     {
          //code
          case xy:
          break;
     }
}

или

private function exerciseClickHandler(event:MouseEvent):void{
     //do something with exerciseSeries.selectedItem
}

Я имею в виду, что вы написали, что все останавливается после нажатия на первый элемент.И согласно предоставленному вами коду, он должен остановиться, потому что после первого щелчка exerciseSeries.selectedItem больше не будет null, так как он выбран.Так что удалите условное выражение, которое вы написали, и используйте экземпляр.

1 голос
/ 18 апреля 2011

Я бы посоветовал вам настроить ChangeWatcher, чтобы следить за selectedItem (или selectedItems, если вы собираетесь разрешить множественный выбор в какой-то момент). Пример:

protected exerciseSeriesCreationCompleteHandler(event:FlexEvent):void{
   ChangeWatcher.watch(this,['exerciseSeries','selectedItem'], handleChange_SelectedItem);
}

protected function handleChange_SelectedItem(event:PropertyChangeEvent):void{
   // Either
   dispatchedEvent(//some custom event);
   // Or
   someDirectMethodCall();
}

Альтернативой может быть поиск экземпляра класса событий в иерархии представлений под координатами мыши, когда пользователь щелкает.

//Attach this click handler to the component

    private function handleClick(event : MouseEvent) : void {
        var obj : *EventClass*= null;
        var applicationStage : Stage = FlexGlobals.topLevelApplication.stage as Stage;

        var mousePoint : Point = new Point(applicationStage.mouseX, applicationStage.mouseY);
        var objects : Array = applicationStage.getObjectsUnderPoint(mousePoint);

        for (var i : int = objects.length - 1; i >= 0; i--) {
            if (objects[i] is *EventClass*) { 
                obj = objects[i] as *EventClass*;
                break;
            }
        }

   if(obj is *EventClass*){
      //Dispatch some custom event with obj being the item that was clicked on.
   }
}

Где EventClass - это класс объектов, представляющих события

0 голосов
/ 21 апреля 2011

У меня были подобные проблемы, и иногда вы можете обойтись, обернув объект Box и поместив событие click на Box. Если вы еще этого не пробовали, это дешевое, простое решение (если оно работает для вас).

<mx:Box click="exerciseClickHandler(event)">
 <code:ScheduleViewer id="exerciseSeries"  />
</mx:Box>
...