Actionscript 3 根据对象类型更改的Flex自定义TreeItemRenderer?
我有一个Flex-tree控件,它保存了一棵充满各种类型对象的树。我想基于此类型(和其他属性)更改项目的标签。我更喜欢在自定义TreeItemRenderer中执行此操作,而不是通过label或labelfunction 似乎无论我做什么,我都无法对对象进行类型检查或强制转换,因此我在树的节点中得到[Object]。这是我的建议:Actionscript 3 根据对象类型更改的Flex自定义TreeItemRenderer?,actionscript-3,apache-flex,user-interface,flex4,tree,Actionscript 3,Apache Flex,User Interface,Flex4,Tree,我有一个Flex-tree控件,它保存了一棵充满各种类型对象的树。我想基于此类型(和其他属性)更改项目的标签。我更喜欢在自定义TreeItemRenderer中执行此操作,而不是通过label或labelfunction 似乎无论我做什么,我都无法对对象进行类型检查或强制转换,因此我在树的节点中得到[Object]。这是我的建议: public class MyCustomTreeItemRenderer extends TreeItemRenderer { // Overriding
public class MyCustomTreeItemRenderer extends TreeItemRenderer {
// Overriding to set the text for each tree node.
override protected function updateDisplayList(unscaledWidth:Number,
unscaledHeight:Number):void {
super.updateDisplayList(unscaledWidth, unscaledHeight);
if (super.data) {
trace("Rendering node:");
if (super.data is MyClassA) {
trace(" MyClassA");
super.label.text = MyClassA(super.data).name
}
if (super.data is MyClassB) {
trace(" MyClassB");
super.label.text = MyClassB(super.data).id;
}
}
}
public function NavigateTreeItemRenderer() {
super();
}
}
检查跟踪显示我正在渲染节点,但我从未在两条if语句中的任何一条中结束。当我在调试器中运行时,我实际上可以在“数据”上找到对应于MyClassA和MyClassB的属性
事实证明,我被一个微妙的问题所困扰,ActionScript3编译器自动从我的远程服务SWC中删除了我的类,因为它没有检测到对这些类的任何直接引用。由于这些对象由RemoteObject结果处理程序实例化并放置到子ArrayCollection中,因此编译器无法检测到对它们的引用 当这种情况发生时,Flex的RemoteObject实现不会抛出异常,而是简单地(悄悄地)将它们合并到一个通用对象中,从而否定了它们的强类型接口的值
解决方法是在每个派生服务类中为可能出现在其对象图中的每种类型的值对象声明一个变量。该方法中的类型检查也失败。它们具有所有正确的属性,但无法转换为正确的类型。我开始怀疑这些对象是否是从服务器上的远程方法返回的正确类型。。。