Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache flex flex:使用arraycollection作为绑定变量会给出空数据_Apache Flex - Fatal编程技术网

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

Apache flex flex:使用arraycollection作为绑定变量会给出空数据,apache-flex,Apache Flex,如果有人能回答这个问题,我会很高兴 我有一个actionscript类,如下所示: package { import mx.collections.ArrayCollection; import mx.controls.Alert; import mx.core.UIComponent; public class GridComponent extends UIComponent {

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

我有一个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>
private-var数组:ArrayCollection=new-ArrayCollection();
变量person1:Person=newperson();
person1.id=1;
person1.name=“pavzie1”;
变量person2:Person=newperson();
person2.id=2;
person2.name=“pavzie2”;
变量person3:Person=newperson();
person3.id=3;
person3.name=“pavzie3”;
数组.addItem(person1);
数组.addItem(person2);
数组.addItem(person3);
Person是一个pojo类,具有两个实例变量id和名称

结果是我得到的长度为0。有什么不对吗?? 另外,如果我使用setter和getter放置一个number实例变量,它会正确绑定该值,
所以问题只在于绑定数组集合。

看看这个,我想说您绑定arrayCollection失败了,因为您缺少[Bindable]-标记。试试这个:

[Bindable]
private var array:ArrayCollection = new ArrayCollection();

var person1:Person = new Person();
...
这应该能奏效


将0作为ArrayCollection的长度的原因可能是因为在创建GridComponent后填充了ArrayCollection,并且在该给定点,ArrayCollection尚未保存任何数据。

发生这种情况是有逻辑原因的。首先,调用私有变量数组:ArrayCollection=new ArrayCollection()。这意味着在实例化MXML文件时将创建此ArrayCollection。此时,您有一个空的ArrayCollection。接下来,在设置组件时,它将该空数组集合的值传递给setter(此时是空的ArrayCollection)

在这一点上,一切都按计划进行。然而,没有按计划工作的是绑定机制。正如Michael提到的,ArrayCollection上需要[Bindable]标记:

[Bindable]
private var array:ArrayCollection = new ArrayCollection();

否则,您的组件将永远不会收到任何更改的通知,它将假定空ArrayCollection的值在传递给setter后没有更改。

我同意上面的回答,即必须绑定数组集合,以便在数组集合填充值时更新代码。但是,上述答案中的绑定表达式最适用于标量值,而不是数组

只有当数组集合本身被另一个数组集合替换时,才会触发上面的绑定表达式,而如果同一数组集合的内容被更新,则不会触发上面的绑定表达式(这里的情况就是这样)

为了检测数组内容的更改,有必要为类似此数组的“collectionChange”事件添加事件侦听器


(将数组用作数据组的数据提供程序可能更方便,因为数据组已经实现了必要的逻辑。)

您的意思是,它在setter中告诉您长度为0吗?(对Alert.show()的调用就在那里。)您最好将其放在一个单击处理程序中,然后单击它进行调试

取决于代码的其余部分,setter几乎肯定是在ArrayCollection初始化之后,但在放入任何内容之前被调用的。基本上:

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);
private-var数组:ArrayCollection=new-ArrayCollection();
.
.
.
.array=数组;//Alert.show()显示“0”。
.
.
.
变量person1:Person=newperson();
person1.id=1;
person1.name=“pavzie1”;
变量person2:Person=newperson();
person2.id=2;
person2.name=“pavzie2”;
变量person3:Person=newperson();
person3.id=3;
person3.name=“pavzie3”;
数组.addItem(person1);
数组.addItem(person2);
数组.addItem(person3);

因此,在ArrayCollection中仍然有三个项,但由于在将任何内容放入其中之前调用了setter,因此看到的是“0”,这是正确的。这同样取决于代码的其余部分。

问题可能发生在更高级别的ArrayCollection数据上。您可以发布代码,或者使用调试器确认您的数据有效吗?您得到了什么结果?您是指使用trace语句跟踪的字符串吗?还是你在期待其他结果?正如Jason提到的,我还怀疑问题在于如何设置ArrayCollection;或者当您在自定义组件上设置array属性时。您好,感谢您这么快提供帮助。@Jason,通过发出警报和调试器跟踪语句确认了结果。thanks@flextras,我已编辑了有关创建数组集合的详细信息的问题。请告诉我哪里可能有错。我只是在为一个复杂得多的项目做准备,所以把这些做好是很重要的。谢谢