我有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>
问题:作为属性&#34;标签&#34;和&#34;描述&#34;未设置[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"}));
但这是对的吗?
答案 0 :(得分:2)
摆脱警告的方法是使用具有Bindable属性的自定义类。
[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}" />
项目渲染器并没有真正在这里添加额外的功能,所以你可以这样做。
希望这有帮助。