我有一个actionscript类如下:
package
{
import mx.collections.ArrayCollection;
import mx.controls.Alert;
import mx.core.UIComponent;
public class GridComponent extends UIComponent
{
private var _array:ArrayCollection;
public function GridComponent()
{
}
public function get array():ArrayCollection
{
return _array;
}
public function set array(value:ArrayCollection):void
{
_array = value;
Alert.show(value.length + "");
}
}
}
我从mxml文件中调用它; 数组变量是一个预先填充了一些数据的数组集合。
private var array:ArrayCollection = new ArrayCollection();
var person1:Person = new Person();
person1.id = 1;
person1.name = "pavzie1";
var person2:Person = new Person();
person2.id = 2;
person2.name = "pavzie2";
var person3:Person = new Person();
person3.id = 3;
person3.name = "pavzie3";
array.addItem(person1);
array.addItem(person2);
array.addItem(person3);
<local:GridComponent array="{array}">
</local:GridComponent>
Person是一个pojo类,有2个实例变量id和name
结果是我得到的长度为0.什么可能是错的? 此外,如果我将数字实例变量与setter和getter放在一起,它会正确绑定值, 所以问题只在于绑定数组集合。
答案 0 :(得分:1)
这种情况有一个合乎逻辑的原因。首先,您正在调用private var array:ArrayCollection = new ArrayCollection()。这意味着在实例化MXML文件时会创建此ArrayCollection。此时,您有一个空的ArrayCollection。接下来,在设置组件时,它具有传递给setter的空数组集合的值(此时为空ArrayCollection)。
此时,所有工作都按计划进行。然而,没有按计划工作的是绑定机制。正如Michael所提到的,ArrayBollection上需要[Bindable]标签:
[Bindable]
private var array:ArrayCollection = new ArrayCollection();
如果没有这个,您的组件将永远不会收到任何更改的通知,并且它将假定空ArrayCollection的值自传递给setter后没有更改。
答案 1 :(得分:0)
看看这个,我会说你没有绑定你的arrayCollection,因为你错过了[Bindable] -tag。试试这个:
[Bindable]
private var array:ArrayCollection = new ArrayCollection();
var person1:Person = new Person();
...
这应该可以解决问题。
你得到0作为ArrayCollection长度的原因可能是因为你在GridComponent创建后填充了你的ArrayCollection,并且在那个给定的点上,你的ArrayCollection还没有数据。
答案 2 :(得分:0)
我同意上述答案,这些答案表明必须绑定数组集合,以便在使用值填充数组集合时更新代码。但是,上述答案中的绑定表达式最适用于标量值而不是数组。
只有当数组集合本身被另一个数组集合替换时,才会触发上述绑定表达式;如果更新了同一数组集合的内容,则不是触发上述绑定表达式(如此处所示)。
为了检测对数组的内容的更改,有必要为“collectionChange”事件添加一个事件监听器,如array.addEventListener(“collectionChange”,...) ;
(将数组用作DataGroup的dataProvider可能更方便,因为DataGroup已经实现了必要的逻辑。)
答案 3 :(得分:0)
你的意思是它告诉你长度是0但仍然在二传手? (调用Alert.show()就在那里。)你最好把它放在一个点击处理程序中,然后点击它来调试它。
根据代码的其余部分所说的,在初始化ArrayCollection之后,几乎肯定会调用setter,但是在放入任何内容之前。基本上:
private var array:ArrayCollection = new ArrayCollection();
.
.
.
<GridComponent object>.array = array; // Alert.show() shows "0".
.
.
.
var person1:Person = new Person();
person1.id = 1;
person1.name = "pavzie1";
var person2:Person = new Person();
person2.id = 2;
person2.name = "pavzie2";
var person3:Person = new Person();
person3.id = 3;
person3.name = "pavzie3";
array.addItem(person1);
array.addItem(person2);
array.addItem(person3);
所以你在ArrayCollection中仍然有三个项目,但是因为你在把任何东西放在那里之前调用那个setter,你会看到“0”,这是正确的。这又取决于你的其他代码所说的内容。