Как лучше всего использовать словарь в качестве поставщика данных во Flex? - PullRequest
4 голосов
/ 30 июля 2010

Обычно в Flex вы используете коллекцию, такую ​​как ArrayCollection, в качестве поставщика данных для компонентов.У меня часто хранятся данные в виде словаря, значения которого я хотел бы использовать в качестве поставщика данных.

Как бы вы порекомендовали это сделать?

Ответы [ 2 ]

7 голосов
/ 17 июня 2011

Идеальное решение - не использовать словарь, но это не отвечает на ваш вопрос ...

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

Конечно, с большими словарями это может быть неэффективно, но в большинстве случаев производительность должна быть приемлемой.

Во-первых, вам нужна функция для преобразования из словаря в ArrayCollection.Одного из следующих рабочих примеров может быть достаточно:

Извлечение коллекций ключей / значений из словаря

    public function extractKeys(d:Dictionary):ArrayCollection {
        var keyList:ArrayCollection = new ArrayCollection();
        if(d != null) for(var key:* in d) keyList.addItem(key);
        return keyList;
    }

    public function extractValues(d:Dictionary):ArrayCollection {
        var valueList:ArrayCollection = new ArrayCollection();
        if(d != null) for each(var value:* in d) valueList.addItem(value);
        return valueList;
    }

Тогда вы можете сами связываться с этими функциями!Таким образом, каждый раз при изменении базового словаря обновляются любые объекты, зависящие от этих функций.Например:

Привязка к значениям словаря с помощью функции

    private var myDictionary:Dictionary; //initialized and used elsewhere

    [Bindable(event="dictionaryValueChanged")]
    public function extractValues(d:Dictionary):ArrayCollection {
        var valueList:ArrayCollection = new ArrayCollection();
        if(d != null) for each(var value:* in d) valueList.addItem(value);
        return valueList;
    }

    public function updateDictionary(key:Object, value:Object):void {
        myDictionary[key] = value;
        dispatchEvent("dictionaryValueChanged");
    }

Оттуда вы можете использовать ФУНКЦИЮ в качестве поставщика данных.Как в:

    <mx:DataGrid id="valueGrid" dataProvider="{extractValues()}" />

Всякий раз, когда ваш словарь изменяется (через функцию updateDictionary), он в конечном итоге будет запускать обновление в DataGrid!

Это действительно просто приложение очень мощного методав flex: привязка к функциям .Как только вы это освоите, существует множество проблем, которые можно решить с помощью этого подхода.

Я надеюсь, что это кому-нибудь поможет,

-gMale

РЕДАКТИРОВАТЬ:

Мне бы пришлось поиграть с этим, но я думаю, что вы также можете устранить функцию 'updateDictionary', выполнив что-то вроде этого:

    [Bindable(event="dictionaryValueChanged")]
    private var myDictionary:Dictionary; //initialized and used elsewhere

    [Bindable(event="dictionaryValueChanged")]
    public function extractValues(d:Dictionary):ArrayCollection {
        var valueList:ArrayCollection = new ArrayCollection();
        if(d != null) for each(var value:* in d) valueList.addItem(value);
        return valueList;
    }
1 голос
/ 30 июля 2010

Кроме расширения компонента «dataProvider using» или создания класса ListCollectionView, который будет использовать словарь в качестве источника; Я думаю, вы застряли.

Компоненты на основе списка предназначены для отображения данных, поступающих в той или иной форме. В словаре такого порядка нет.

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