flex 3 доступ к основному mxml из кода ActionScript - PullRequest
4 голосов
/ 04 февраля 2009

Я пишу класс ActionScript для обработки вызовов моей веб-службы. Когда я получаю результат, я хочу вызвать метод установки в моем основном mxml-приложении. Моя проблема в том, что я не знаю, как получить доступ к методам в разделе actionScript моего основного класса mxml из моего класса actionscript, есть идеи?

Ответы [ 3 ]

7 голосов
/ 04 февраля 2009

Дэвид прав - в то время как вы можете получить доступ к открытым членам вашего объекта Application.mxml статически и из любого места в вашем приложении, с точки зрения дизайна это немного нет-нет. Лучше стремиться к слабой связи между вашими объектами, и способ, который делается в идиоме Flex, обычно заключается в расширении EventDispatcher и отправке событий. Например, ваша оболочка WebService может выглядеть примерно так:

public class MyWrapperClass extends EventDispatcher
{
    [Event(name="webserviceComplete", type="flash.events.Event")]

    public function MyWrapperClass(target:IEventDispatcher=null)
    {
        super(target);
    }

    private function handleWebServiceLoadComplete(event:ResultEvent):void
    {
        dispatchEvent(new Event("webserviceComplete"));
    }

    public function doWork():void
    {
        // Load the service, etc., and ultimately call handleWebServiceLoadComplete()...
    }       
}

... и ваш файл Main.mxml так:

<mx:Script>
    <![CDATA[

        private function app_creationComplete(event:Event):void
        {
            var myWrapper:MyWrapperClass = new MyWrapperClass();
            myWrapper.addEventListener("webserviceComplete", mywrapper_webServiceComplete, false, 0, true);
            myWrapper.doWork();
        }

        private function mywrapper_webServiceComplete(event:Event):void
        {
            // Do the work you would've otherwise done in the public method
        }

    ]]>
</mx:Script>

В этом случае конечный результат тот же - завершение загрузки веб-службы вызывает функцию в Main.mxml. Но обратите внимание, как mywrapper_webServiceComplete() объявляется в частном порядке - он не вызывается напрямую MyWrapperClass. Main.mxml просто подписывается (с addEventListener()) на уведомление, когда MyWrapperClass завершает свою работу, а затем выполняет свою собственную работу; MyWrapperClass ничего не знает о деталях реализации Main.mxml, и при этом Main.mxml ничего не знает о MyWrapperClass, кроме того, что он отправляет событие webserviceComplete и предоставляет открытый метод doWork(). Слабая связь и скрытие информации в действии.

Удачи!

6 голосов
/ 04 февраля 2009

Если ваш класс является UIComponent, добавленным в дерево компонентов, то вы можете использовать его атрибут parentApplication. В противном случае используйте статический атрибут Application.application, но только после завершения инициализации приложения. Ранее, это поле null. Частные поля и методы, очевидно, не могут быть доступны. Элементы, объявленные в части MXML с явными id s, являются открытыми.

Добавление такого вызова создает жесткую привязку. Вы можете вместо этого рассмотреть возможность отправки события и обработки этого события в основном приложении.

1 голос
/ 22 июля 2010

В случае, если у кого-то есть такая же проблема:

mx.core.FlexGlobals.topLevelApplication.YOUR_FUNCTION

- это синтаксис для доступа к публичным функциям в main.mxml.

...