【问题标题】:How to call a MXML class in ActionScript3.0 in Flex 3如何在 Flex 3 中调用 ActionScript3.0 中的 MXML 类
【发布时间】:2009-08-14 17:08:58
【问题描述】:

我有一个由自定义组件组成的页面。在那个页面我有一个按钮。如果我单击该按钮,我必须调用另一个页面(由自定义组件组成的 page.mxml)。然后单击事件处理程序是用 Action-script 编写的,在一个单独的文件中。

如何在 ActionScript 中创建 MXML 类的对象?如何显示对象(即页面)?

我的代码:

page1.mxml

<comp:BackgroundButton x="947" y="12" width="61" height="22" 
      paddingLeft="2" paddingRight="2" label="logout" id="logout"
      click="controllers.AdminSession.logout()"
 />

这个 page1.mxml 必须使用另一个类中的 ActionScript 代码调用 page2.mxml:

static public function logout():void {
   var startPage:StartSplashPage = new StartSplashPage();
}

【问题讨论】:

标签: actionscript flex3 mxml


【解决方案1】:

您的 Actionscript 类需要对显示列表的引用才能将您的组件添加到舞台。 MXML 只是简单的声明性动作脚本,因此在动作脚本中创建实例或使用 MXML 表示法没有区别。

你的功能:

static public function logout():void {
   var startPage:StartSplashPage = new StartSplashPage();
}

可以改为:

static public function logout():StartSplashPage {
   return new StartSplashPage();
}

或:

static public function logout():void {
   var startPage:StartSplashPage = new StartSplashPage();
   myReferenceToDisplayListObject.addChild( startPage );
}

如果您的操作脚本没有对显示列表的引用,则您无法将自定义组件添加到显示列表。添加基于 MXML 的自定义组件与将任何其他 DisplayObject 添加到显示列表没有什么不同:

var mySprite:Sprite = new Sprite();
addChild(mySprite)

等同于:

var startPage:StartSplashPage = new StartSplashPage();
myReferenceToDisplayListObject.addChild( startPage );

Sprite 和 StartSplashPage 都是 DisplayObject 的核心扩展。

您在 cmets 中将 MVC 引用到另一个答案。在不知道您实现的具体框架的情况下,或者在您尝试执行此操作的上下文方面向我们提供更多代码的情况下,很难给出更具体的答案。

【讨论】:

    【解决方案2】:

    我假设您在一个包含一组组件的页面上,并希望将页面上的这组组件替换为一组不同的组件。如果这不是您想要做的,我提前道歉。

    您可以使用 ViewStacks 并在选择时切换所选索引来执行此操作——这可以通过数据绑定或通过在 controllers.AdminSession.logout() 中触发事件并在主页中监听该事件并切换处理函数中视图堆栈的 selectedIndex。

    MainPage.mxml

    <mx:ViewStack>
    <views:Page1...>
        ...
        <comp:BackgroundButton x="947" y="12" width="61" height="22" 
              paddingLeft="2" paddingRight="2" label="logout" id="logout"
                  click="controllers.AdminSession.logout()"/>
    </views:Page1...>
    <views:Page2 ...>
        ...
        <comp:Comp1 .../>
        <comp:Comp2 .../>
    </views:Page2>
    

    【讨论】:

      【解决方案3】:

      我认为你可以使用状态来做你的工作。

      你可以看看http://blog.flexexamples.com/2007/10/05/creating-view-states-in-a-flex-application/#more-221

      编辑: 我不确定我是否完全理解你的情况。

      据我所知,您可以在 page1.mxml 中创建一个新状态,并为其命名,例如。 secondPageState,然后将自定义组件page2.mxml放在secondPageState中。

      在控制器中,您需要一个 import 语句来导入 page1 组件并为 page1 组件创建一个公共 var,例如。第一页。

      然后,代码将类似于: 公共函数注销():无效 { firstPage.currentState = "secondPageState"; }

      另一种解决方案: 如果您不喜欢更改状态解决方案,您可以尝试使用 addchild 将自定义组件添加到您的应用程序中。

      【讨论】:

      • 我在 ActionScript 中有一个控制器类,它必须调用 StartSplashPage.mxml。代码需要在 ActionScript 中实现,才能实现 MVC 模式。
      • 但是您仍然可以使用 ActionScript 来更改当前状态。由于 StartSplashPage.mxml 只是另一个视图,它不会破坏 MVC 模式。
      • 对不起,我能告诉你,你能解释一下吗,代码比如如何添加到静态公共函数 logout():void { var startPage:StartSplashPage = new StartSplashPage(); }
      • 另外,StartSplashPage.mxml应该是自定义组件,不是函数,我觉得不能用new StartSplashPage()。
      • 迈克尔,你错了。 MXML 组件只是一个使用 MXML 标记以声明方式创建的 Actionscript 类。它们可以像任何其他类一样使用新的 MyComponent() 语法进行实例化。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-06
      • 2010-10-09
      • 1970-01-01
      相关资源
      最近更新 更多