【问题标题】:mxml modules and variables visibilitymxml 模块和变量可见性
【发布时间】:2012-04-26 15:03:48
【问题描述】:

考虑下面的代码

<fx:Script source="Script.as" />
......................
<s:Group>
    <s:layout>
        <s:HorizontalLayout/>
    </s:layout>
    <s:Spacer width="10" />
    <s:Button label="1" click="doSomething()"/>
    <s:Button label="2" click="holder.getCanvas().testDraw()"/>
    <s:Button label="3" click="doSomething()"/>
</s:Group>
<s:Scroller id="canvasGroup" width="650" height="500">
    <s:Group>
        <local:CanvasHolder id="canvas" />
    </s:Group>
</s:Scroller>

我想在一个单独的模块中移动按钮(我们称之为Toolbar.mxml)。因此我需要移动&lt;fx:Script source="Script.as" /&gt;(在Script.as 中我也使用画布)。这是我的问题:

  1. 如何在Toolbar.mxml 中看到canvas var(我可以)?
  2. 是否有可能以某种方式 pu &lt;fx:Script source="Script.as" /&gt; 以便可以从 Toolbar.mxml 看到它。

【问题讨论】:

    标签: actionscript-3 flash apache-flex mxml


    【解决方案1】:
    1. 您将无法在Toolbar.mxml 中自动“看到”canvas。我建议使用 Flex 的事件架构来访问它。

      //Extend Event class to hold any data that must be passed
      //from Toolbar -> canvas
      public class CustomEvent extends Event
      {
          public static const CUSTOM_EVENT:String = "CustomEventTypeString";
          public var mImportantInfo:String = "";
      
          public function CustomEvent();
          {
              super(CUSTOM_EVENT);
          }
      
          override public function clone():Event
          {
              var evt:CustomEvent = new CustomEvent();
              evt.mImportantInfo = mImportantInfo;
              return evt;
          }
      }
      
      //in Script.as
      myToolbarID.addEventListener(CustomEvent.CUSTOM_EVENT,customEventHandler);
      ...
      protected function customEventHandler(var evt:CustomEvent)
      {
          canvas.myFunction(evt.mImportantInfo);
      }
      
      //in Toolbar.mxml
      var evt:CustomEvent = new CustomEvent();
      evt.mImportantInfo = "canvas needs me!";
      dispatchEvent(evt);
      

      或者,您可以将画布对象直接传递给工具栏。

      <local:Toolbar ... myCanvas="{canvas}" ... />
      
      //in Toolbar.mxml
      public var myCanvas:CanvasHolder;
      ...
      myCanvas.myFunction(...);
      

      是的,第二个选项更简单,但是当需要通信的组件不容易相互传递时,第一个选项通常很有用。

    2. 如果你需要的话,你可以把&lt;fx:Script source="Script.as" /&gt; in Toolbar.mxml。如果您需要调用父级范围内的函数,我建议再次使用事件架构,而不是某种parent...Application.application... 调用。

    【讨论】:

      【解决方案2】:

      了解您在做什么的最佳方式是使用-keep 选项进行编译 - 这将生成从 MXML 模板编译的实际 AS3 代码。

      假设使用 &lt;Script source="script.as"/&gt; 不是一个好方法 - 这与在 AS3 中使用 include "script.as" 相同 - IDE 不喜欢它,而且总的来说,它很混乱。如果您需要“代码背后”,只需先在 AS3 中编写,然后在 MXML 中扩展您的 AS3 类。

      要理解的另一件重要事情 - 每次在 MXML 模板中使用 id 属性时,生成的类都会有一个名为 id 属性值的公共属性。因此,如果您将代码的某些部分移到声明该属性的类(或 MXML 模板)之外 - 您将按照与 AS3 类相同的方式进行处理 - objectWithTheProperty.property

      【讨论】:

        猜你喜欢
        • 2017-04-30
        • 2014-04-05
        • 2011-07-30
        • 2015-07-06
        • 1970-01-01
        • 2015-10-20
        • 2014-09-20
        • 2021-01-03
        相关资源
        最近更新 更多