最近在做项目时,碰到一些非常诡异的问题,全都是与组件的itemRender有关,郁闷了好半天,才解决了问题。
比如说在使用datagrid组件时,在某列中使用itemRender,如果itemRender中重写了data属性,那么你试图选中某行时(在使用itemRender列上点击),会选不中。如果去掉重写的data属性,就不会产生上面的问题。到底是什么具体的原因,目前还不太明白,希望有知道的指点一下。谢谢!
同样,是itemRender的惹的祸。在tileList组件中,使用了itemRender,在itemRender中,我同样重写了一下data属性,结果给我出现了一些奇异的问题。比如说,有些数据能显示,而有些不能,不能显示的地方出现空白区域。如果把重写的data属性去掉,就不会产生该问题。
以下是我重写的data属性代码:
private var _goods:Object;
[Bindable]
public function get goods():Object {
return _goods;
}
public function set goods(value:Object):void {
if (goods != value) {
_goods = value;
}
return ;
}
override public function set data(value:Object):void {
super.data = value;
goods = value;
return ;
}
我只是为了方便,所以重写了一下data属性,结果出现了上面的问题。
我查了相关的资料,发现Object对象是不能绑定的,原因它没有实现IEventDispatcher接口,因此在虚拟机编译时(如果使用了[Bindable]标签)生成事件绑定代码时,就会失败,也就不能派发事件了。所以就算你使用了[Bindable]标签也没有用。
可是让我百思不得其解的是,data同样是Object类型的,为什么它就可以呢,
最后我查看了它源码,才发现了其中的源由:
[Bindable("dataChange")]
[Inspectable(environment="none")]
/**
* The <code>data</code> property lets you pass a value
* to the component when you use it in an item renderer or item editor.
* You typically use data binding to bind a field of the <code>data</code>
* property to a property of this component.
*
* <p>You do not set this property in MXML.</p>
*
* @default null
* @see mx.core.IDataRenderer
*/
public function get data():Object
{
return _data;
}
public function set data(value:Object):void
{
_data = value;
dispatchEvent(new FlexEvent(FlexEvent.DATA_CHANGE));
invalidateDisplayList();
}
在组件中的data属性中,派发了一个change事件,才使绑定成功的。
所以我修改一下上面的代码,也能解决不能全部显示的问题:
private var _goods:Object;
[Bindable("dataChanged")]
public function get goods():Object {
return _goods;
}
public function set goods(value:Object):void {
if (goods != value) {
_goods = value;
dispatchEvent(new Event("dataChanged"));
}
return ;
}
override public function set data(value:Object):void {
super.data = value;
goods = value;
return ;
}