Flex ListCollectionView, оборачивающий список, в чем заключается магия - PullRequest
1 голос
/ 15 декабря 2011

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

Я объясню ситуацию:

Тамэто источник данных, назовем его ds, он загружает ArrayCollection (ac) в класс модели (m).Тогда у класса представления (v) есть два ListCollectionViews l1 и l2.И l1, и l2 имеют функции фильтра, поэтому половина данных отфильтровывается из l1, а другая половина - из l2.

Теперь все это имеет смысл, но если я добавлю данные в l1 или l2, они автоматически добавятся в m.ac.Как это происходит?Мое лучшее предположение состоит в том, что базовая структура данных всех трех списков одинакова.Но так как я так долго застрял в этом, я хотел бы знать, что происходит.Google не сильно помог в этом.

[Подробнее] По запросу я добавлю еще несколько деталей.Извините, я не могу скопировать и вставить то, над чем работаю.

внутри модели:

      [Bindable] public var ac:ArrayCollection     = null;

внутри источника данных:

    private function resultHandlerac (event:ResultEvent) : void {
        var ac:ArrayCollection = helperClass.arrayFromResultEvent (event); 
        m.ac = ac;
      }

вид изнутри:

        [Bindable] public var l1:ListCollectionView;
        [Bindable] public var l2:ListCollectionView;

        private function resultHandlerac (ac:ArrayCollection) : void {

            week1Hours = new ListCollectionView(ac);
            week1Hours.filterFunction = function(i:Object) : Boolean { return i.WeekID 
            == 1 && !i.Removed; };

            week2Hours = new ListCollectionView(hoursData);
            week2Hours.filterFunction = function(i:Object) : Boolean { return i.WeekID 
            == 2 && !i.Removed; };

            l1.refresh();
            l2.refresh();
        }

И есть сетка данных, которая отображает l1 и l2, каждый раз, когда редактируется поле, внутри сетки данных обновляются три списка.Если требуется дополнительная информация, пожалуйста, дайте мне знать.Я не могу выложить настоящий код здесь, поскольку это не проект с открытым исходным кодом, над которым я работаю.

1 Ответ

4 голосов
/ 15 декабря 2011

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

Это оставляет исходную коллекцию нетронутой, когда вы фильтруете ее. Например:

var ac:IList = new ArrayCollection([1, 2, 3]);

var l1:ICollectionView = new ListCollectionView(ac);
//filter out only item '1'
l1.filterFunction = function(item:int):Boolean {return item == 1;}
l1.refresh();

var l2:ListCollectionView = new ListCollectionView(ac);
//filter out all items but '1'
l2.filterFunction = function(item:int):Boolean {return item != 1;}
l2.refresh();

trace(ac); //1,2,3
trace(l1); //1
trace(l2); //2,3

В то же время вы все равно можете добавлять в него элементы, как если бы это был сам обернутый Ilist:

l2.addItem(4);
trace(ac); //1,2,3,4
trace(l1); //1
trace(l2); //2,3,4

Просто взгляните на исходный код ListCollectionView, и вы увидите, что происходит:

public function addItemAt(item:Object, index:int):void
{
    ...
    list.addItemAt(item, listIndex);
}
...