从外部 AS 访问 MXML 中定义的元素

Posted

技术标签:

【中文标题】从外部 AS 访问 MXML 中定义的元素【英文标题】:Access to elements defined in MXML from External AS 【发布时间】:2010-10-09 08:58:01 【问题描述】:

我有一个带有表单的 MXML,其中有两个 TextInput。我讨厌在 MXML 文件中包含任何代码(我来自 javascript 格式),所以我使用了

mx:Script source="external.as"

标记以包含任何 MXML 文件中使用的任何代码。问题是,如果我在external.as 文件中有此代码:

private function populateFromForm():void
   var vo:ValidObject= new ValidObject();
   vo.market = marketInput.text;
   vo.segment = segmentInput.text;
   vo.priceLow = priceLowInput.text;
   vo.priceHigh = priceHighInput.text;

其中 marketInput、segmentInput、priceLowInput 和 priceHighInput 是在 MXML 文件中定义的 TextInput。当我尝试编译时,我得到一个 1120: Access to undefined property XXXXX

我尝试在函数之前添加以下行:

public var marketInput:TextInput;
public var segmentInput:TextInput;
public var priceLowInput:TextInput;
public var priceHighInput:TextInput;

但是我得到一个 1151:A conflict exists with definition XXXX in namespace internal,这很有意义。

有没有办法做到这一点,而不必将所有输入引用作为函数的参数传递给函数?

【问题讨论】:

你能把mxml文件贴出来吗? 【参考方案1】:

您需要创建对 TextInputs 父容器实例的引用,然后使用该引用来访问 TextInputs 及其属性。我认为我们需要对您的文件结构进行一些澄清。您如何创建父容器的实例?我想这是你需要做的:

MyForm.mxml:

<?xml version="1.0" encoding="utf-8"?>
<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml">
    <mx:TextInput id="marketInput" />
    <mx:TextInput id="segmentInput" />
    <mx:TextInput id="priceLowInput" />
    <mx:TextInput id="priceHighInput" />
</mx:VBox>

SaveVOContainer.as:

package

    public class SaveVoContainer extends Container
    
        private var myForm:MyForm = new MyForm();

        public function SaveVOContainer
        
            this.addChild(myForm);
        

        private function populateFromForm():void
           var vo:ValidObject= new ValidObject();
           vo.market = myForm.marketInput.text;
           vo.segment = myForm.segmentInput.text;
           vo.priceLow = myForm.priceLowInput.text;
           vo.priceHigh = myForm.priceHighInput.text;
        
    

【讨论】:

【参考方案2】:

在 Flex 中执行“代码隐藏”很痛苦。没有部分类的概念或 Javascript 中原型继承的灵活性。 Google 为许多资源提供“flex 中的代码隐藏”。

我认为你最好习惯在 mxml 中嵌入代码的想法。使用脚本标签尽可能避免内联代码。如果您必须在 MXML 中编写大量代码,也许您可​​能希望将代码重构为多个自定义组件。可重复使用的奖励积分。

【讨论】:

非常感谢,我刚刚做到了。我只是不同意“痛苦”的形容词,我发现它实际上非常干净且易于理解(您通常会惊呼“..它是如此明显,我不敢相信我自己没有找到它!”)【参考方案3】:

在 Flex 中执行代码隐藏的规范方法是通过继承。这是来自文档的一个很好的解释:http://learn.adobe.com/wiki/display/Flex/Code+Behind。简而言之:

    声明一个 ActionScript 类以用作您的基类。 将基类设置为 MXML 文件中的根容器。 对于在 MXML 文件中声明的任何控件,您必须使用完全相同的名称将它们重新声明为基类的公共成员(正如您在上面为带有源标记的脚本块所做的那样,只有它有效 :-)

那么,你的 ActionScript 文件:

package mypackage

    import mx.controls.TextInput;

    public class myClass extends WindowedApplication
    
        public var marketInput:TextInput;

        private function populateFromForm():void
            /* As above */
        
    

以及对应的MXML文件:

<?xml version="1.0" encoding="utf-8"?>
<custom:myClass xmlns:custom="mypackage.*"
        xmlns:fx="http://ns.adobe.com/mxml/2009"
        xmlns:s="library://ns.adobe.com/flex/spark" 
        xmlns:mx="library://ns.adobe.com/flex/mx">
    <mx:TextInput id="marketInput"/>
</custom:myClass>

您的其他 TextInput 控件等等。现在你的 populateFromForm 函数应该可以工作了。

不得不两次重新声明相同的实体有点令人发指,但这并不是之前的受访者所说的伤害袋子(尽管这可能在 Flex 4 中进行了更改以减轻痛苦)。

【讨论】:

【参考方案4】:

在 .AS 中导入:

import mx.core.Application;

在 .AS 中使用这个:

mx.core.Application.application.component.property = value; mx.core.Application.application.myText.text = 'test';

【讨论】:

【参考方案5】:

您的 mxml 文件中是否有指向 ActionScript 文件的脚本标记?

<mx:Script source='includes/foo.as' />

【讨论】:

是的,我在 MXML 文件中有脚本引用。

以上是关于从外部 AS 访问 MXML 中定义的元素的主要内容,如果未能解决你的问题,请参考以下文章

通过从 flex 中的另一个 mxml 文件访问组件来使组件不可见

如何访问另一个组件中一个 mxml 中的数据网格?

有没有办法从其中的元素访问 iframe 外部的 Dom?

Flex 访问自定义组件的子属性

AS3在运行时加载和访问外部SWF中的字体

无法从创建它的方法外部访问 C-Array 元素