flex 3 передает данные из модулей в родительское приложение для переключения представлений в стековом представлении - PullRequest
1 голос
/ 11 января 2010

Hello Fellow stackoverflowers,

Я застрял, написав кусок кода. У меня есть приложение с ViewStack ведьмы загрузки 5 модулей. каждый модуль загружается через тэг moduleLoader, и все они имеют идентификатор.

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

Контекстное меню загружается через xml.

это мой файл заявки.

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
      layout="absolute"
      backgroundColor="#b1b1b1"
      backgroundGradientColors="[#b1b1b1,#252525]">

<mx:Script>
<![CDATA[
import mx.core.Container;


        //change viewstack views via modules context menu
        public function switchView(viewId:String):void
     {
         var container:Container = Container(tops.getChildByName(viewId));
         if (container != null)
         {
             tops.selectedChild = container;
         }
     }
]]>
</mx:Script>

<mx:ViewStack id="tops" width="100%" height="100%">
  <mx:ModuleLoader id="admin" url="view/admin.swf" width="100%" height="100%"/>
  <mx:ModuleLoader id="tv" url="view/tv.swf" width="100%" height="100%"/>
  <mx:ModuleLoader id="community" url="view/community.swf" width="100%" height="100%"/>
  <mx:ModuleLoader id="shop" url="view/shop.swf" width="100%" height="100%"/>
  <mx:ModuleLoader id="communicator" url="view/communicator.swf" width="100%" height="100%"/>
</mx:ViewStack>


</mx:Application>

и это мой оператор switch в моем модуле

public function changeView():void{
switch(action) {
case "admin":
    parentApplication.switchView("admin");
break;
case "tv":
    parentApplication.switchView("tv");
break;
case "shop":
    parentApplication.switchView("shop");
break;
case "community":
    parentApplication.switchView("community");
break;
case "default":
    parentApplication.switchView("communicator");
break;
 }
}

и это мое контекстное меню xml

  <mx:XML id="appMenu">
    <root>
        <menuitem enabled="false"/>
        <menuitem label="Administration" action="admin" icon="adminMDI"/>
        <menuitem label="Television" action="tv" icon="tvMDI"/>
        <menuitem label="Community" action="community" icon="communityMDI"/>
        <menuitem label="Shopping Mall" action="shop" icon="shoppingMallMDI"/>
        <menuitem label="Communicator" action="default" icon="communicatorMDI"/>                                                              
    </root>
  </mx:XML>

То, что я хотел бы сделать, - это переключать представления в стеке просмотра, щелкая один из пунктов меню в контекстном меню. я не могу общаться из моего модуля в приложение. Что я делаю неправильно? что я должен сделать? Кто-нибудь может мне помочь?

Да, прежде чем я забуду

xml контекстного меню находится в модуле, но контекстное меню находится в виде файла, который расширяет кнопку.

пожалуйста, любой орган может дать мне хороший пример, как это сделать.

Спасибо

DJ

1 Ответ

5 голосов
/ 11 января 2010

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

Во-первых, в вашей функции changeView () вы объявляете действие переменной, а затем включаете его.

public function changeView():void {
    var action:String;
    switch(action) {
        // action will always be null here.
    }
}

Поскольку в вашем операторе switch нет регистра по умолчанию, parentApplication.switchView никогда не будет вызываться.

Кроме того, для краткости вы можете написать операторы switch следующим образом:

switch(action) {
    case "admin":
        parentApplication.changeView("admin");
    break;
    case "tv":
        parentApplication.changeView("tv");
    break;
    case "shop":
        parentApplication.changeView("shop");
    break;
    // ... etc ...
    default:
        // this gets called if action doesn't match anything.
    break;
}

Наконец, вы можете сэкономить еще больше печатания, потому что ваши действия и идентификаторы модулей одинаковы, вы можете сделать это:

public function changeView(action:String):void {
    parentApplication.changeView(action);
}

Возможно, попробуйте эти вещи и затем обновите свой вопрос (также, XML для ваших контекстных меню не отображался правильно в вашем вопросе). Это может помочь сообществу решить вашу проблему немного легче.

UPDATE

Не думаю, что проблема в связи модуля. Я построил простой проект, который делает то, что я думаю, что вы ищете. Я разместил источник ниже.

mmodules.mxml

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" implements="interfaces.IApplication">
    <mx:Script>
        <![CDATA[
            import mx.core.Container;
            public function changeView(action:String):void {
                viewstack.selectedChild = viewstack.getChildByName(action) as Container;
            }
        ]]>
    </mx:Script>
    <mx:ViewStack id="viewstack" width="100%" height="100%">
        <mx:ModuleLoader id="module1" url="views/module1.swf" />
        <mx:ModuleLoader id="module2" url="views/module2.swf" />
    </mx:ViewStack>
</mx:Application>

интерфейсы / IApplication.as

package interfaces {
    public interface IApplication {
        function changeView(action:String);
    }
}

Вид / module1.mxml

<?xml version="1.0" encoding="utf-8"?>
<mx:Module xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
    <mx:Script>
        <![CDATA[
            import interfaces.IApplication;
            import mx.events.MenuEvent;
            import mx.controls.Menu;
            /**
            * Dynamically builds a menu.
            */
            protected function showMenu():void {
                var m:Menu = Menu.createMenu(null, menuData, false);
                m.labelField = '@label';
                m.addEventListener(MenuEvent.ITEM_CLICK, onItemClick);
                m.show(10, 10);
            }
            /**
            * Handles whenever an item in the menu is clicked.
            */
            protected function onItemClick(e:MenuEvent):void {
                if(e && e.item && e.item is XML) {
                    changeView(e.item.@action);
                }
            }
            /**
            * Tells the parent application to switch views.
            */
            protected function changeView(action:String):void {
                var app:IApplication = parentApplication as IApplication;
                switch(action) {
                    case 'module1':
                        app.changeView('module1');
                    break;
                    case 'module2':
                        app.changeView('module2');
                    break;
                }
            }
        ]]>
    </mx:Script>
    <mx:XML format="e4x" id="menuData">
        <root>
            <menuitem label="Module 1" action="module1" />
            <menuitem label="Module 2" action="module2" />
        </root>
    </mx:XML>
    <mx:Button label="Show menu" click="showMenu()" />
</mx:Module>

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

...