DJ.*_*DJ. 1 apache-flex module contextmenu communication viewstack
你好同伴stackoverflowers,
我写了一段代码.我有一个viewstack巫婆加载5个模块的应用程序.每个模块都通过moduleLoader标签加载,它们都有一个id.
每个加载的模块都有一个上下文菜单 上下文菜单有5个menuItems.一个menuItem用于视图堆栈的每个视图.
上下文菜单通过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>
Run Code Online (Sandbox Code Playgroud)
这是我的模块中的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;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的上下文菜单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>
Run Code Online (Sandbox Code Playgroud)
我想要做的是通过单击上下文菜单中的一个菜单项来切换视图堆栈中的视图.我无法从我的模块与应用程序进行通信.我究竟做错了什么?我必须做什么?有人可以帮帮我吗?
哦,在我忘记之前
上下文菜单的xml在模块中,但是上下文菜单位于扩展按钮的as文件中.
请任何机构能给我一个很好的例子来说明如何做到这一点.
谢谢
DJ
在进入多模块通信之前,我看到了几个问题.
首先,在你的changeView()函数中,你声明变量动作然后打开它.
public function changeView():void {
var action:String;
switch(action) {
// action will always be null here.
}
}
Run Code Online (Sandbox Code Playgroud)
因为switch语句中没有'default'大小写,所以永远不会调用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;
}
Run Code Online (Sandbox Code Playgroud)
最后,你可以节省更多的输入,因为你的动作和模块id是相同的,你可以这样做:
public function changeView(action:String):void {
parentApplication.changeView(action);
}
Run Code Online (Sandbox Code Playgroud)
也许尝试这些事情,然后更新你的问题(同样,你的上下文菜单的XML没有在你的问题中正确呈现).这可能有助于社区更轻松地解决您的问题.
我不认为问题出在模块通信中.我建立了一个简单的项目,可以完成我认为你正在寻找的东西.我在下面发布了这个来源.
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>
Run Code Online (Sandbox Code Playgroud)
接口/ IApplication.as
package interfaces {
public interface IApplication {
function changeView(action:String);
}
}
Run Code Online (Sandbox Code Playgroud)
意见/ 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>
Run Code Online (Sandbox Code Playgroud)
希望有所帮助.