我有一个带有表单的 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:访问未定义的属性 XXXXX

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

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

但我得到的是 1151:与命名空间内部的定义 XXXX 存在冲突 这是完全有道理的。

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

有帮助吗?

解决方案

做一个“代码隐藏”是在Flex中痛苦。有没有局部类的概念或原型继承的和在JavaScript的灵活性。谷歌为“在柔性代码隐藏”了许多资源。

我觉得这是更好的,你习惯在MXML中嵌入代码的想法。使用脚本标记避免内联代码尽可能。如果你写了很多内MXML代码,也许你可能要重新因子代码为多个自定义组件。积分如果它们是可重复使用的。

其他提示

您需要创建到TextInputs'父容器的一个实例的引用,然后使用该参考_1的存取的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;
        }
    }
}

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

  1. 声明一个 ActionScript 类用作基类。
  2. 将基类设置为 MXML 文件中的根容器。
  3. 对于 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 中的这一点可能会发生变化,使其比以前不那么痛苦)。

  • 将其导入到 .AS 中:

    import mx.core.Application;

  • 在 .AS 中使用:

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

你有没有在你的MXML文件的脚本标记指向你的ActionScript文件?


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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top