Flex Tree Properties,Null Reference?

时间:2009-02-02 13:42:31

标签: xml flex tree

我正在删除一个大型XML文件,我无法控制它的结构。

我使用自定义函数来使用标记名称将树结构视为弹性树,但随后它会中断。我猜它与我的其他函数有关,一个从所选节点调用属性值的函数。

见代码。

<mx:Tree x="254" y="21" width="498" height="579" id="xmllisttree"       labelFunction="namer" dataProvider="{treeData}" showRoot="false"  change="treeChanged(event)" />

//and the Cdata

import mx.rpc.events.ResultEvent; 
[Bindable] private var fullXML:XMLList;  
private function contentHandler(evt:ResultEvent):void{  
    fullXML = evt.result.page;  
}  

[Bindable]
public var selectedNode:Object;

public function treeChanged(event:Event):void {
selectedNode=Tree(event.target).selectedItem;
}

 public function namer(item:Object):String {
        var node:XML = XML(item);
        var nodeName:QName = node.name();
        var stringtest:String ="bunny";
            return nodeName.localName;
        }

<mx:Tree x="254" y="21" width="498" height="579" id="xmllisttree" labelFunction="namer" dataProvider="{treeData}" showRoot="false" change="treeChanged(event)" />

错误是TypeError:错误#1009:无法访问空对象引用的属性或方法。

空引用在哪里?

3 个答案:

答案 0 :(得分:1)

行。听起来你的XML看起来像这样:

<root>
  <test>
    <child>leaf 1</child>
  </test>
  <test2>
    <child2>leaf 2</child2>
  </test2>
</root>

这一点的重要部分是child和child2标签中有简单的内容。展开树以显示“叶1”或“叶2”会导致您收到错误,因为node.name()将返回null。这是有道理的,因为'leaf 1'和'leaf 2'是文本节点,没有节点名称。

要解决此问题,您可以将命名函数更新为以下内容:

public function namer(item:Object):String {
    var node:XML = XML(item);
    var nodeName:QName = node.name();
    if (nodeName) {
        return nodeName.localName;
    } else {
        return String(node);
    }
}

这将使用'leaf 1'和'leaf 2'作为树中相应节点的标签。

答案 1 :(得分:0)

您是否尝试过在flex builder或eclipse中调试它?

空引用错误的最可能的候选者是传递给namer()的'item'参数。树组件确实将字符串传递给labelFuntion方法,但它可能不是可以转换为xml对象的字符串。我肯定会先检查一下。

我能看到的另一件事是错误的是你正在访问localName,就好像它是一个属性一样。它实际上是方法,所以你应该通过nodeName.localName()来调用它。 编辑...这是不正确的,因为我没有意识到nodeName是QName类型。 localName实际上是此类型的属性。 appologies

编辑:您的Tree组件也有一个

的dataProvider
dataProvider="{treeData}"

从您给出的示例看起来不像treeData存在。应该是fullXML吗?

答案 2 :(得分:0)

根据Flex和回答我的另一个问题的人(Herreman)称localname为财产是正确的做事方式。

fullXML和stringtest行是工件。我将XML嵌入到同一个文件atm中。

尝试绘制叶节点时,返回nodeName.localName失败。 所以我知道这与它有关:

return nodeName.localName;

public function treeChanged(event:Event):void {
selectedNode=Tree(event.target).selectedItem;
}