我在Flex 4 / AS3中编写了以下代码,但它没有按预期工作。
所以,我想知道我的代码是否有问题......我会解释一下:
TileTest.mxml
<s:Application minWidth="955" minHeight="600" creationComplete="createButtons()"
<fx:Script>
<![CDATA[
import Object.TestButton;
import mx.collections.ArrayList;
private var _names:Array = ["one", "two", "three"];
public function createButtons():void
{
var buttons:ArrayList = new ArrayList();
for(var a:int = 0; a < _names.length; a++)
{
var testButton:TestButton = new TestButton();
testButton.customName = _names[a];
buttons.addItem(testButton);
}
myList.dataProvider = buttons;
}
]]>
</fx:Script>
<s:VGroup gap="12" width="100%">
<s:Label text="Options" fontSize="18" fontWeight="bold" color="#333333" />
<s:List width="100%" height="100%" id="myList" itemRenderer="Object.TestButton" borderVisible="false">
<s:layout>
<s:TileLayout orientation="rows" columnWidth="290" rowHeight="90" columnAlign="left" horizontalGap="0" verticalGap="0" />
</s:layout>
</s:List>
</s:VGroup>
</s:Application>
这是我的申请。在这里,我有一个名为 myList 的List,我加载了一些 TestButton 。我为循环内的每个按钮设置了一个名称。
TestButton
<s:Group width="300" height="90" click="{ Alert.show(_name); }"
<fx:Script>
<![CDATA[
import mx.controls.Alert;
private var _name:String = "just a test...";
public function set customName(newName:String):void
{
_name = newName;
Alert.show(_name);
this.addEventListener(MouseEvent.MOUSE_OVER, function():void{ Alert.show(_name); });
}
]]>
</fx:Script>
<s:BorderContainer accentColor="#000000" width="100%" height="100%" />
</s:Group>
正如您所看到的,我在此组件中有三个警报......我这样做了,我们可以理解这个问题。
当我设置应用程序中出现的customName时,会出现第一个警报,如图所示。
第二个应该出现在Mouse_Over上,因为事件监听器已添加到Group元素中。
第三个警报应该在Group元素中单击时发生。
现在,如果我运行生成的swf,我会看到屏幕上的所有三个按钮和三个警报,应用程序每个设置一个customName,它会提醒正确的名称。
如果我将鼠标悬停在任何按钮上,则不会提示任何消息。
如果我点击任何按钮,它会提示默认消息设置为 _name 属性,这只是“只是一个测试...”
我无法理解这是什么问题,因为我希望它始终提醒应用程序为每个按钮设置的名称。另外,我不想更改组件......我所说的是我想要一个带有私有字符串的List和TestButtons。
如果问题出在这些具体实施中,那么除了改变它之外别无他法......
谢谢大家!
答案 0 :(得分:1)
问题是您的数据提供程序中有TestButton
列表,而不仅仅是普通数据。这些按钮被创建,这就是您看到正确的警报消息的原因。
因此,Flex会看到一个包含三个项目的列表,因此它会创建另外三个TestButtons
来呈现列表中的数据。但是那些TestButtons
是全新的,具有其属性的默认值。
要解决此问题,最好只在数据提供程序ArrayList中包含数据,并且可以通过项呈示器的data
属性访问它。