【问题标题】:Flex Tree Properties, Null Reference?弹性树属性,空引用?
【发布时间】:2009-02-02 13:42:31
【问题描述】:

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

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

查看代码。

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

//和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;
        }

错误是 TypeError: Error #1009: Cannot access a property or method of an null object reference。

空引用在哪里?

【问题讨论】:

  • 您在使用 FlexBuilder 吗?如果是,您是否尝试过在代码中设置断点? TypeError 是否在堆栈跟踪中报告行号?
  • 我认为从您提供的代码中很难理解您的问题:从未调用过namer,没有加载任何xml文件。如果您提供允许重现问题的代码示例,则更容易为您提供帮助。
  • @Axelle Labelfunction 列在指向包含代码的 XML 中。

标签: xml apache-flex tree


【解决方案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”是文本节点,没有节点名称。

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

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' 作为树中相应节点的标签。

【讨论】:

    【解决方案2】:

    根据 Flex 和回答我另一个问题的人 (Herreman) 的说法,将 localname 称为属性是正确的做事方式。

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

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

    return nodeName.localName;
    

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

    【讨论】:

    • 本地名称是一种方法。应该是“返回 nodeName.localName();”不确定这是否是唯一的问题。
    【解决方案3】:

    你试过在 flex builder 或 eclipse 中调试这个吗?

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

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

    编辑:你的 Tree 组件也有一个 dataProvider

    dataProvider="{treeData}"
    

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

    【讨论】:

      猜你喜欢
      • 2012-05-16
      • 1970-01-01
      • 2018-05-12
      • 2011-08-21
      • 1970-01-01
      • 2012-06-02
      • 1970-01-01
      • 2016-10-16
      • 1970-01-01
      相关资源
      最近更新 更多