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

时间:2009-02-23 17:16:24

标签: flex mxml external textinput

我有一个带有表单的MXML,里面有两个TextInputs。我讨厌在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文件中定义的TextInputs。当我尝试complile时,我得到 1120:访问未定义的属性XXXXX

我尝试在函数之前添加这些行:

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

但相反,我得到了 1151:名称空间内部中的定义XXXX存在冲突,这非常有意义。

有没有办法在不必将函数的所有输入引用作为参数传递的情况下执行此操作?

5 个答案:

答案 0 :(得分:5)

您需要创建对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;
        }
    }
}

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

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

  1. 声明一个ActionScript类以用作基类。
  2. 将基类设置为MXML文件中的根容器。
  3. 对于在MXML文件中声明的任何控件,您必须使用完全相同的名称将它们重新声明为基类的公共成员(就像您对带有源标记的脚本块所做的一样,只有它可以工作:-)
  4. 所以,你的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中的这种情况可能会因为它变得不那么痛苦而变得不那么痛苦) )。

答案 3 :(得分:1)

  • 在.AS中导入:

    import mx.core.Application;

  • .AS中的
  • 使用此:

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

答案 4 :(得分:0)

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


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