2009-02-23 67 views
2

我有一个带有表单的MXML,里面有两个TextInputs。我讨厌任何一块的MXML文件内代码(I来自一个JavaScript形成),所以我使用从外部AS访问MXML中定义的元素

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。当我尝试请编译我得到一个1120:访问未定义的属性XXXXX

我曾尝试加入之前函数此行:

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

而是我得到一个1151:一个存在冲突命名空间内部中的定义XXXX非常合理。

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

+0

你可以张贴MXML文件? – mmattax 2009-02-23 17:20:08

回答

3

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

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

+0

非常感谢,我只是。 我只是不同意这个“痛苦”的形容词,我发现它实际上很干净,很容易理解(你通常所说的那种东西)“它很明显,我不相信我没有找到它我自己!“) – Chepech 2010-04-09 18:55:12

0

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

 

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

是的,我在MXML文件中有脚本引用。 – Chepech 2009-02-26 16:50:10

5

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

在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> 

等等为你的其他特xtInput控件。现在你的populateFromForm函数应该可以工作。

有两次必须重新声明相同的实体有点令人发指,但它并不完全是早期受访者所做的伤害包(尽管这可能会在Flex 4中发生变化,使其不那么痛苦是)。

1
  • 在.AS此导入:

    import mx.core.Application;

  • 在.AS使用:

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