#asp.net #apache-flex #weborb
#asp.net #apache-flex #weborb
Вопрос:
я новичок в flex. У меня вопрос 🙂
У меня есть
[Bindable]
private var model:AlgorithmModel = new AlgorithmModel();
private var serviceProxy:Algorithm = new Algorithm( model );
В MXML
private function Show():void
{
// now model.Solve_SendResult = null
while(i<model.Solve_SendResult.length) //
{
Draw(); //draw cube
}
}
private function Solve_Click():void
{
//request is a array
Request[0] = 2;
Request[1] = 2;
Request[2] = 3;
serviceProxy.Solve_Send(request);
Show();
}
<s:Button x="386" y="477" label="Solve" click="Solve_Click();"/>
И когда я звоню serviceProxy.Solve_Send(request);
с запросом, это массив, и я хочу использовать model.Solve_SendResult
в своем коде flex для рисования многих кубов, использующих papervison3d, но в первый раз, когда я получил model.Solve_SendResult = null
. Но когда я снова нажимаю, все в порядке.
Кто-нибудь мне поможет? Спасибо?
Ответ №1:
Модель.Объект Solve_SendResult содержит результат выполненного ServiceProxy.Метод Solve_Send (запроса). Solve_Send будет выполняться асинхронно, и в результате в момент запуска метода show объект Solve_SendResult может по-прежнему иметь значение null.
В качестве решения вы можете использовать следующее:
-
Создайте пользовательское событие
package foo { import flash.events.Event; public class DrawEvent extends Event { public static const DATA_CHANGED:String = "dataChanged"; public function DrawEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false) { super(type, bubbles, cancelable); } } }
-
В вашем классе алгоритмов определите следующее:
[Event(name=DrawEvent.DATA_CHANGED, type="foo.DrawEvent")] public class Algorithm extends EventDispatcher{ //your code
-
В методе Solve_SendHandler класса Algorithm добавьте следующее
public virtual function Solve_SendHandler(event:ResultEvent):void { dispatchEvent(new DrawEvent(DrawEvent.DATA_CHANGED)); //your code }
-
В вашем классе MXML создайте метод onLoad и добавьте прослушиватель событий к экземпляру класса Algorithm, как показано ниже:
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" initialize="onLoad()"> public function onLoad():void { serviceProxy.addEventListener(DrawEvent.DATA_CHANGED, onDataChanged); } private function onDataChanged(event:DrawEvent):void{ while(i<model.Solve_SendResult.length) // { Draw(); //draw cube } }
-
внесите следующие изменения в метод Solve_Click():
private function Solve_Click():void { //request is a array Request[0] = 2; Request[1] = 2; Request[2] = 3; serviceProxy.Solve_Send(request); }
Вот и все! Итак, в основном приведенный выше код выполняет следующее: вы добавили слушателя в свой сервис (класс алгоритма), и слушатель прослушивает DrawEvent.Событие DATA_CHANGED. Событие рисования.DATA_CHANGED будет отправлен, когда ваш клиент получит результат вызова Solve_Send. Таким образом, onDataChanged нарисует ваш куб или сделает все, что вы хотите 🙂
Описанный выше подход является базовым, и вы должны знать, как события работают в flex и как вы можете с этим справиться. Дополнительная информация доступна здесь:
http://livedocs.adobe.com/flex/3/html/help.html?content=createevents_3.html http://livedocs.adobe.com/flex/3/html/help.html?content=events_07.html
С уважением, Кирилл