从外部 AS 访问 MXML 中定义的元素
-
06-09-2019 - |
题
我有一个带有表单的 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. 。简而言之:
- 声明一个 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 中的这一点可能会发生变化,使其比以前不那么痛苦)。
将其导入到 .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' />