在Flex中,使用字典作为数据提供者的最佳方法是什么?

时间:2010-07-29 20:00:12

标签: flex actionscript-3

通常在Flex中,您使用像ArrayCollection这样的集合作为组件的数据提供者。我经常将数据存储为字典,其值我想用作数据提供者。

你会如何推荐这样做?

2 个答案:

答案 0 :(得分:7)

理想的解决方案是不使用字典但不回答你的问题...

所以,如果你被迫使用词典,解决这个问题的一种方法就是使用一个函数作为你的“中间人”。它可以介于您的字典和关注何时更改的Flex组件之间。

当然,对于大型词典,这可能效率低下,但在大多数情况下,性能应该是可以接受的。

首先,您需要一个从Dictionary转换为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");
    }

从那里你可以使用THE FUNCTION作为你的数据提供者。如:

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

每当你的字典改变时(通过updateDictionary函数),它最终会触发DataGrid中的更新!

这实际上只是flex中非常强大的技术的应用:binding to functions。一旦掌握了它,就可以通过这种方法解决各种各样的问题。

我希望能有所帮助,

-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 :(得分:1)

除了扩展“dataProvider using”组件,或创建将使用Dictionary作为源的ListCollectionView类之外;我觉得你有点卡住了。

基于列表的组件旨在显示以某种形式订购的数据。字典没有这样的顺序。