регистрация слушателей событий в контроллере - PullRequest
0 голосов
/ 10 ноября 2009

Я работаю над созданием простого приложения MCV, чтобы лучше понять MVC. У меня проблема с регистрацией слушателей событий. Я вижу MVC в том, что представление отправляет события, контроллер прослушивает эти события и воздействует на них, обновляя модель или изменяя представление. Таким образом, в моем приложении MVC у меня есть контроллер, который во время инициализации должен регистрировать все события, отправляемые представлением. Это мой контроллер:

открытый класс AppController расширяет UIComponent { приватная переменная _model: StaffAppModel;

    public function AppController( model:StaffAppModel)
    {
        trace( "controller created" );
        this._model = model;

        // start up register event listeners
        this.addEventListener( "saveUserEvent", saveUserHandler );      
    }

    // event handler
    public function saveUserHandler( e:SaveUserEvent ):void
    {
        trace("saveUserHandler run");
        trace( e._userObj.getFirstname() );     
    }
}

Проблема в моем клиентском файле (я пишу приложение AIR на основе Flex, поэтому у меня есть файл MXML). В этом файле MXML я инициализирую контроллер и добавляю компоненты представления.

        private function onInit():void
        {
            var _model:StaffAppModel = new StaffAppModel();
            var _controller:AppController = new AppController( _model );

        }
    ]]>
</mx:Script>

<mx:VRule horizontalCenter="-56" bottom="10" top="10" width="1" strokeColor="#000000"/>

<comp:DetailsView x="10" y="17" width="325" />
<comp:StaffListView x="352" y="10" height="570" width="400"/>

Затем я отправляю события из этих компонентов представления. Вот пример представления, отправляющего событие:

публичная функция saveUser (): void { _userObj.setFirstname (firstnameTxt.text); _userObj.setLastname (lastnameTxt.text); _userObj.setJobtitle (jobTitleTxt.text); var evt: SaveUserEvent = new SaveUserEvent (_userObj);

            dispatchEvent( evt );
        }

Теперь это способ сделать это, и почему мой контроллер не регистрирует обработчики событий?

Спасибо

Ответы [ 2 ]

1 голос
/ 10 ноября 2009

Поскольку ваш контроллер не находится в стеке представлений, у него никогда не будет возможности перехватить событие. Обычно вы хотите, чтобы в вашем контроллере была ссылка на ваше представление, чтобы вы могли напрямую подключать прослушиватели событий. Другим подходом было бы создание одноэлементного класса диспетчера, расширяющего EventDispatcher. Таким образом, вы могли бы отправлять и прослушивать события в центральном узле, и все могло оставаться разъединенным. Например, ваш взгляд может идти:

myDispatcher.dispatchEvent(new MyEvent( MyEvent.SOMETHING_AWESOME) )

и ваш контроллер:

myDispatcher.addEventListener(MyEvent.SOMETHING_AWESOME, awesomeHandler);
0 голосов
/ 10 ноября 2009

Я думаю, вы немного запутались в регистрации ваших событий. Если вы говорите:

this.addEventListener( "saveUserEvent", saveUserHandler );

Это означает, что событие сработает, если «this» отправит событие. Я думаю, что вы хотите добавить прослушиватель событий к вашим представлениям, например так:

myView.addEventListener( "saveUserEvent", saveUserHandler );

Затем, когда «myView» отправляет «saveUserEvent», вызывается функция saveUserHandler.

Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...