错误场景:本次错误场景在使用别人的Flex组件,迁移代码,复制功能至新项目中。编译都过了,没有报错误,运行时,点击相应功能出错,而且不能进入下一步,界面直接卡死。错误提示如下:
TypeError: Error #1007: 尝试实例化的函数不是构造函数。
at mx.core::ClassFactory/newInstance()[E:\dev\4.y\frameworks\projects\framework\src\mx\core\ClassFactory.as:172]
at mx.controls.dataGridClasses::DataGridColumn/http://www.adobe.com/2006/flex/mx/internal::getMeasuringRenderer()[E:\dev\4.y\frameworks\projects\mx\src\mx\controls\dataGridClasses\DataGridColumn.as:1906]
at mx.controls::DataGrid/commitProperties()[E:\dev\4.y\frameworks\projects\mx\src\mx\controls\DataGrid.as:1935]
at mx.core::UIComponent/validateProperties()[E:\dev\4.y\frameworks\projects\framework\src\mx\core\UIComponent.as:8219]
at mx.managers::LayoutManager/validateProperties()[E:\dev\4.y\frameworks\projects\framework\src\mx\managers\LayoutManager.as:597]
at mx.managers::LayoutManager/doPhasedInstantiation()[E:\dev\4.y\frameworks\projects\framework\src\mx\managers\LayoutManager.as:813]
at mx.managers::LayoutManager/doPhasedInstantiationCallback()[E:\dev\4.y\frameworks\projects\framework\src\mx\managers\LayoutManager.as:1180]
其实错误提示说的很清楚:尝试实例化的函数不是构造函数
,但是和传统的错误指向了某行代码又不一样,其实就是实例化某些对象时失败了。
代码确实不好查,我也是跟代码查了半天,后来才找到错误所在,错误提示告诉了我初始化mx.controls.dataGridClasses::DataGridColumn
这些对象失败,然我此处代码如下:
public function init_dataGrid(qx:FGridQxBean,grid:DataGrid):void{
var columns:Array = new Array();
if(qx.discList == null || qx.discList.length < 1){
Alert.show("列属性为空!!");
}
for each(var colItem:GridDiscripBean in qx.discList){
if(colItem.showGrid == false){
continue;
}
var dataCol:DataGridColumn = init_dataGridColumn(colItem);
columns.push(dataCol);
}
grid.columns = columns;
}
private function init_dataGridColumn(colItem:GridDiscripBean):DataGridColumn{
var column:DataGridColumn = new DataGridColumn();
column.width = colItem.colWith;
if(colItem.colName){
column.dataField = colItem.colName;
}
column.headerText = colItem.discName;
if(colItem.renderer){
var renderer:Class = GlobalParameters.getClassDefinition(colItem.renderer);
column.itemRenderer = new ClassFactory(renderer);
}
// column.setStyle("textAlign","center");
return column;
}
所有的 datagrid
列和器渲染(即:itemRenderer)都是根据数据动态完成的,然后查数据,使用了DataGridItemLinksRenderer
、DataGridItemLinkButRenderer
这些自定义 Renderer,检查代码,都在,没有语法错误。知道再次Debuger,错误定格在此处,才有种豁然开朗的感觉:
Flex使用反射机制实例化对象之前,需要主程序中创建过,否则实例化时,会找不到资源。那错误也就不言而喻了。
在 Applications 中添加 new DataGridItemLinksRenderer();
,new DataGridItemLinksRenderer()
语句即可。问题解决了 特此记录。