Отсоедините класс, который извлекает данные из анализатора и средства обновления представления - PullRequest
1 голос
/ 16 июля 2011

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

Класс может быть похож на следующее:

package 
{
    import flash.net.URLLoader;
    import flash.net.URLVariables;
    import flash.net.URLRequest;
    import flash.net.URLRequestMethod;
    import flash.events.Event;
    import flash.events.IOErrorEvent;
    //
    public class CSManager extends MovieClip
    {
        //
        var scriptLoader:URLLoader;
        //
        public function CSManager()
        {
            scriptLoader = new URLLoader();
            scriptLoader.addEventListener(Event.COMPLETE, handleLoadSuccessful);
            scriptLoader.addEventListener(IOErrorEvent.IO_ERROR, handleLoadError);
        }
        //;
        public function handleLoadSuccessful($evt:Event):void
        {
            trace("Message sent.");
        }
        //
        public function handleLoadError($evt:IOErrorEvent):void
        {
            trace("Message failed.");
        }
        //
        public function sendLoad(variable):void
        {
            var scriptRequest:URLRequest = new URLRequest("http://mydomain/myapp/my.php");
            var scriptVars:URLVariables = new URLVariables();

            scriptVars.var1 = variable;

            scriptRequest.method = URLRequestMethod.POST;
            scriptRequest.data = scriptVars;

            scriptLoader.load(scriptRequest);
        }

    }

}

Итак, я представляю, что в теле метода, вызванного кнопкой, я создаю экземпляр этого класса и вызываю метод CSManager sendLoad.

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

Что может быть хорошим подходом для решения этой проблемы?

Редактировать: Я нашел лучший код , но, похоже, проблема здесь та же.

Ответы [ 3 ]

0 голосов
/ 16 июля 2011

Вы слышали о шаблоне MVC ?если нет, прочитайте страницу википедии, чтобы лучше понять это.

вы бы осуществили связь клиент / сервер в «модели» и после получения ответа отправили событие / уведомление в представление.модель не обязательно должна быть мувиклипом, потому что она не имеет визуального представления - просто обычный класс.если вы хотите запускать события, вы можете расширяться от EventDispatcher

public class MyModel extends EventDispatcher
{
   // ...

   private function onDate(evt:Event):void
   {
     // check if data was returned ...
     dispatchEvent(new MyEvent("dataReceived", data);
   }
}

, и представление должно прослушивать события "dataReceived".

public class MyView extends MovieClip
{
   // ...

   public function MyView(model:MyModel)
   {
     // check if data was returned ...
     model.addEventListener("dataReceived", updateView);
   }

   private function updateView(evt:MyEvent):void
   {
      // parse data and do sth with it
   }
}

, и у вас будет основной класс, в которомвы создаете все:

public class Main extends MovieClip
{
   private var model:MyModel;
   private var view:MyView;

   public function Main()
   {
      model = new MyModel();
      view = new MyView(model);
   }
 }

или вы можете использовать такие фреймворки, как puremvc или robotlegs - это хорошая отправная точка для создания вашего приложения на ...

0 голосов
/ 18 июля 2011

Я написал сообщение в блоге именно на эту тему - надеюсь, оно даст вам полезное чтение!Короче говоря, Том экономит деньги - если бы Loader отправил событие COMPLETE, когда данные будут готовы к сбору, Mediator (класс, который отделяет View от остальной части вашего приложения), можетпредоставить данные для просмотра.

0 голосов
/ 16 июля 2011

Отправка события. Это один из эффективных способов развязки вашего кода.

Ваш класс расширяет MovieClip, а MovieClip расширяет Sprite, который расширяет InteractiveObject, который расширяет EventDispatcher. Это означает, что ваш объект является EventDispatcher и, следовательно, может отправлять событие таким образом:

dispatchEvent(new Event(MYEVENT));

В коде, который использует этот класс, вы должны прослушивать событие следующим образом:

var csManager:CSManager=new CSManager();
csManager.addEventListener(MYEVENT,myHandler);

также вам понадобится постоянная строка

const MYEVENT:String ="MYEVENT";

определено где-то разумно (как статическое свойство класса CSManager)

Просто чтобы уточнить, я не предлагаю вам называть ваше мероприятие MYEVENT, вы можете изменить его на что-то более значимое, например STRAWBERRIES_AND_CREAM или что-то еще, что имеет смысл в вашем конкретном контексте.

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