flex:使用arraycollection作为绑定变量给出空数据

时间:2011-07-24 20:28:54

标签: flex

如果有人能回答这个问题,我会很高兴。

我有一个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放在一起,它会正确绑定值, 所以问题只在于绑定数组集合。

4 个答案:

答案 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”,这是正确的。这又取决于你的其他代码所说的内容。