如何将动态对象添加到 Flex 中的可绑定 ArrayCollection?
How to add dynamic objects to bindable ArrayCollection in Flex?
我有一个 ArrayCollection
作为 TabBar
的数据提供者。
添加的每个项目必须具有两个属性:label
和 description
.
我动态定义这些项目如下:
[Bindable] //required to serve as data provider
private var mybar:ArrayCollection;
public function init() {
mybar = new ArrayCollection();
mybar.addItem({label: "Test1", description: "long test test"});
}
<s:TabBar dataProvider="{mybar}">
<s:ItemRenderer>
<s:ButtonBarButton label="{data.label}" /> //description might also be used here, but omitted
</s:ItemRenderer>
</s:TabBar>
问题:由于属性"label"和"description"没有设置[Bindable]
,有如下错误日志:
warning: unable to bind to property 'label' on class 'Object' (class is not an IEventDispatcher)
warning: unable to bind to property 'description' on class 'Object' (class is not an IEventDispatcher)
我怎样才能避免这种情况?
如果我使用ObjectProxy
警告消失:
mybar.addItem(new ObjectProxy( {label: "Test1", description: "long test test"}));
但这对吗?
消除警告的方法是使用具有可绑定属性的自定义 class。
[Bindable]
public class BarData
{
public var label:String;
public var description:String;
public function BarData(label:String, description:String)
{
this.label = label;
this.description = description;
}
}
并以此来初始化它
public function init():void {
mybar = new ArrayCollection();
mybar.addItem(new BarData("Test1", "some description"));
mybar.addItem(new BarData("Test2", "some description"));
}
如上所述的另一种方法将其包装在 ObjectProxy 中:
public function init():void {
mybar = new ArrayCollection();
mybar.addItem(new ObjectProxy({label:"Test1", description:"some description"}));
mybar.addItem(new ObjectProxy({label:"Test2", description:"some description"}));
}
我很好奇您使用的是哪个 SDK,因为在我的 FlashBuilder 中,使用 SDK 4.7,您定义 TabBar 的方式导致了令人失望的结果。我必须这样做才能让它工作:
<s:TabBar dataProvider="{mybar}">
<s:itemRenderer>
<fx:Component>
<s:ItemRenderer>
<s:ButtonBarButton label="{data.label}" />
</s:ItemRenderer>
</fx:Component>
</s:itemRenderer>
</s:TabBar>
这样定义它更容易:
<s:TabBar dataProvider="{mybar}" />
项目渲染器并没有真正在此处添加额外的功能,因此您可以这样做。
希望对您有所帮助。
我有一个 ArrayCollection
作为 TabBar
的数据提供者。
添加的每个项目必须具有两个属性:label
和 description
.
我动态定义这些项目如下:
[Bindable] //required to serve as data provider
private var mybar:ArrayCollection;
public function init() {
mybar = new ArrayCollection();
mybar.addItem({label: "Test1", description: "long test test"});
}
<s:TabBar dataProvider="{mybar}">
<s:ItemRenderer>
<s:ButtonBarButton label="{data.label}" /> //description might also be used here, but omitted
</s:ItemRenderer>
</s:TabBar>
问题:由于属性"label"和"description"没有设置[Bindable]
,有如下错误日志:
warning: unable to bind to property 'label' on class 'Object' (class is not an IEventDispatcher)
warning: unable to bind to property 'description' on class 'Object' (class is not an IEventDispatcher)
我怎样才能避免这种情况?
如果我使用ObjectProxy
警告消失:
mybar.addItem(new ObjectProxy( {label: "Test1", description: "long test test"}));
但这对吗?
消除警告的方法是使用具有可绑定属性的自定义 class。
[Bindable]
public class BarData
{
public var label:String;
public var description:String;
public function BarData(label:String, description:String)
{
this.label = label;
this.description = description;
}
}
并以此来初始化它
public function init():void {
mybar = new ArrayCollection();
mybar.addItem(new BarData("Test1", "some description"));
mybar.addItem(new BarData("Test2", "some description"));
}
如上所述的另一种方法将其包装在 ObjectProxy 中:
public function init():void {
mybar = new ArrayCollection();
mybar.addItem(new ObjectProxy({label:"Test1", description:"some description"}));
mybar.addItem(new ObjectProxy({label:"Test2", description:"some description"}));
}
我很好奇您使用的是哪个 SDK,因为在我的 FlashBuilder 中,使用 SDK 4.7,您定义 TabBar 的方式导致了令人失望的结果。我必须这样做才能让它工作:
<s:TabBar dataProvider="{mybar}">
<s:itemRenderer>
<fx:Component>
<s:ItemRenderer>
<s:ButtonBarButton label="{data.label}" />
</s:ItemRenderer>
</fx:Component>
</s:itemRenderer>
</s:TabBar>
这样定义它更容易:
<s:TabBar dataProvider="{mybar}" />
项目渲染器并没有真正在此处添加额外的功能,因此您可以这样做。
希望对您有所帮助。