我现在有两个ArrayCollection(a,b),并且a是可绑定的。我想用b重置a。
我们项目中的旧代码如下:
a = new ArrayCollection();
for (var i:int = 0; i < b.length; i++) {
a.addItem(b.getItemAt(i));
}
然后,我认为这可能会导致潜在的内存泄漏。所以我把它改成:
a.removeAll();
for (var i:int = 0; i < b.length; i++) {
a.addItem(b.getItemAt(i));
}
然后我读了一个主题:Flex优化技巧:ArrayCollection.removeAll()与ArrayCollection.source=new Array()。这是个虫子吗?它表示,当数据集很大时,removeAll()将导致性能问题。
那么,这是否意味着有一个骗局?如果数据集很小,我应该使用removeAll,如果数据集很大,我不应该使用removyAll()?
另一个问题,我还读了一个关于更改数组集合的源的主题。它说,如果直接使用a=b,"它将杀死所有在ArrayCollection实例上侦听事件的数据绑定控件"。我不明白。我尝试了a=b,它工作正常(使用a作为数据提供程序的视图会更新)。
使用a=b和a.source=b.source有什么区别?
我是Flex的新手。提前谢谢。
ArrayCollection是一个围绕Array的包装类,底层Array可以使用源属性进行访问
ArrayCollection类是一个包装类,它将数组公开为可以使用方法访问和操作的集合以及ICollectionView或IList接口的属性。操作在ArrayCollection实例上修改数据源;例如,如果在ArrayCollection上使用removeItemAt()方法时基础数组中的项。
- 因此,如果已填充Array,则应始终使用ArrayCollection的Source属性我建议将b声明为Array而不是ArrayCollection,并将a初始化为
a = new ArrayCollection(b); or a= new ArrayCollection();// Default constructor ArrayCollection(source:Array=null); a.source = b; //updates data in Arraycollection
数据绑定意味着绑定控件与数据源(可以是任何东西,如函数、对象、其他控件、数组、XML、集合、列表等)
数据绑定是将一个对象中的数据绑定到另一个对象的过程对象它提供了一种在应用程序的不同层。数据绑定需要源属性、目标属性和触发事件指示何时将数据从源复制到目标。一对象在源属性更改。
- 数据绑定可能对具有大数据的应用程序有害,因为它会创建多个更改事件,getter和setter都会在更改时执行,这需要额外的处理,因此缩短a的范围并将数据直接提供给源
private function handler_B_DataChange(event:Event) { var a:Arraycollection = new ArrayCollection(b); controlA.dataProvider = a; //or just controlB.dataProvider = new ArrayCollection(b); }
绑定的详细信息可以在绑定到函数、对象和数组上查看
帮助的希望
我也会尝试:
a.removeAll();
a.addAll(b.list);
申报时:
a = new ArrayCollection()
它丢失了指向"旧"ArrayCollection的指针,该指针绑定到应用程序。因此,这就是为什么当您执行"new ArrayCollection"时,绑定不再起作用。然而,在您的示例中,您并没有创建"新的ArrayCollection"。。。你只是用其他东西替换ArrayCollection中的对象。。。所以绑定仍然有效。
如果你有成千上万的数据,你可能想考虑实现某种分页。如果只有几百个,那么我认为你不需要太担心.removeAll()的性能;