Я вижу пару проблем, прежде чем приступить к многомодульной связи.
Во-первых, в вашей функции 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>
Надеюсь, это поможет.