PDA

Просмотр полной версии : как изменить currentState application ИЗ компонента?


kaibest
29.07.2010, 17:20
решил навести порядок в программе, как рекомендуют, разделил всё на компоненты. очень даже не плохо. но возникли проблемы... я создал компонент - кнопку, нажав на которую я хочу изменить currentState программы (не компонента) на другой. но флекс думает что я хочу изменить стейт компонента, и не найдя его выдаёт ошибку соответственно.

так как же изменить стейт главного приложения из компонента?

GBee
29.07.2010, 17:28
События до упора , а там ловите и меняйте.

Волгоградец
29.07.2010, 17:29
Передать событие в родительский объект. Была тема вчера.

kaibest
29.07.2010, 17:53
пытался разобраться, но не получилось :( я только начинаю работать с флексом, по этому есть куча вещей которых я ещё не знаю...

кнопка находиться в панели, панель находиться в компоненте group, далее компонент вставляется в application (главное приложение), далее

<s:Button label="жми" click="setCurrentState('main')"/>

GBee
29.07.2010, 18:04
Читайте тогда про события, баблинг и все такое.

kaibest
29.07.2010, 18:22
почитал. что такое события и что такое баблинг я понял. но не вижу как мне это поможет..?


private function setNewState(event:Event):void
{
trace(event.currentTarget);
}


даёт мне длииииинный список. что с ним делать?

ap.AppSkin2._AppSkin_Group1.Group4.contentGroup._ap_LoginForm1.Panel8.PanelSkin9._PanelSkin_Group1.contents.contentGroup.Button21

Dimitry_II
29.07.2010, 19:02
Всплытие события позволит подниматься ему по иерархии родителей пока он не натолкнется на обработчик этого события. Ставишт обработчик там, где тебе надо стейт поменять, ловишь событие и меняешь.

kaibest
29.07.2010, 23:19
не расскажешь по подробнее..? что-то я всё пробую понять какой ивент и на кого его ставить? и кто должен слушать его?

GBee
30.07.2010, 00:32
Аппликейшен ждет события клика по кнопке от group, вероятно, и меняет себе стейт.

Ivanaka
30.07.2010, 14:25
parentApplication.currentState="нужный стейт"

Dimitry_II
30.07.2010, 17:13
Что-то тема разрослась и стала путаться. Давай сделаем "по классике", а ты себе уже изменишь что хочешь ...

В компоненте определяешь событие:
<fx:Metadata>
[Event(name="myEvent", type="flash.events.Event")]
</fx:Metadata>

Для отсылки используем диспетчер:
<s:Button label="жми" click="dispatchEvent(new Event('myEvent'))"/>

А в родительском классе/окне/компоненте при определении текущего компонента:
<xxx:Component ... myEvent="myEventHandler(event)">
и обработчик:
private function myEventHandler(event:Event):void {
...
}

Это механизм передачи стандартного события из пакета flash.event. Если надо организовать что-то свое (кастомный эвент), то создаешь класс, расширяющий эвент, с нужными параметрами/механизмом и передаешь его. Но все в принципе схоже.

kaibest
31.07.2010, 03:27
Ivanaka спасибо :) проще некуда. а главное работает. но я уже по другому сделал всё, в принципе как сказал Dimitry_II :) пришлось покопаться в исходниках разных