flex: использование arraycollection в качестве переменной bind дает пустые данные - PullRequest
0 голосов
/ 25 июля 2011

Буду рад, если кто-нибудь ответит на это.

У меня есть класс 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 с двумя переменными экземпляра id и именем

В результате я получаю длину 0. Что может быть не так ?? Кроме того, если я поместил переменную экземпляра числа с сеттерами и геттерами, это правильно связывает значение так что проблема только в связывании коллекции массивов.

Ответы [ 4 ]

1 голос
/ 25 июля 2011

Есть логическая причина, по которой это происходит. Сначала вы вызываете приватный массив var: ArrayCollection = new ArrayCollection (). Это означает, что эта коллекция ArrayCollection создается при создании экземпляра вашего файла MXML. На данный момент у вас есть пустой ArrayCollection. Затем, когда ваш компонент настроен, у него есть значение этой пустой коллекции массивов, переданной в установщик (который на данный момент является пустой ArrayCollection).

На данный момент все работает как запланировано. Однако то, что не работает, как запланировано, является механизмом привязки. Как упоминал Майкл, тег [Bindable] необходим для коллекции ArrayCollection:

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

Без этого ваш компонент никогда не будет уведомлен о каких-либо изменениях, и он будет предполагать, что значение пустой ArrayCollection не изменилось с момента его передачи установщику.

0 голосов
/ 15 октября 2013

Вы имеете в виду, что он говорит вам, что длина равна 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);

Таким образом, у вас все еще есть три элемента в этой коллекции ArrayCollection, но, поскольку вы вызываете этот установщик перед тем, как что-то поместить туда, вы видите «0», что правильно. Опять же, это зависит от того, что говорит остальная часть вашего кода.

0 голосов
/ 15 октября 2013

Я согласен с приведенными выше ответами, которые отмечают, что коллекция массивов должна быть связана для обновления кода, когда коллекция массивов заполняется значениями.Однако выражения привязки в приведенных выше ответах лучше всего работают для скалярных значений, а не массивов.

Вышеуказанные выражения привязки запускаются только в том случае, если сама коллекция массивов заменяется другой коллекцией массивов, а не , еслисодержимое той же коллекции массивов обновляется (как, по-видимому, и здесь).

Чтобы обнаружить изменения в содержимом массива, необходимо добавить событиеслушатель события "collectionChange", подобного этому array.addEventListener ("collectionChange", ...);

(может быть удобнее использовать массив в качестве dataProvider с DataGroup, потому что DataGroup уже реализуетнеобходимая логика.)

0 голосов
/ 25 июля 2011

Глядя на это, я бы сказал, что вам не удалось привязать массив arrayCollection, поскольку у вас отсутствует тег [Bindable]. Попробуйте это:

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

var person1:Person = new Person();
...

Это должно сработать.

Причина, по которой вы получаете 0 в качестве длины для вашей коллекции ArrayCollection, возможно, заключается в том, что вы заполняете свою коллекцию ArrayCollection после того, как ваша GridComponent была создана, и в данный момент ваша коллекция ArrayCollection еще не содержит данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...