我想把Object放到Tree.dataProvider中

时间:2014-02-19 04:45:58

标签: xml json actionscript-3 tree

问题

- 我想制作分层树结构

- 通过API从PHP获得JSON数据结构

- 尝试使用" mx.controls.Tree"

- Tree.dataProvider只接受XML

- 使用JSON.decode()[as3corelib]

将JSON解析为Object

- 使用SimpleXMLEncoder.encodeValue()[mx.rpc.xml.SimpleXMLEncoder]将对象解析为XML

- 并输入Tree.dataProvider


危害

然后,我得到了这个观点。

Tree view screenshot


原因

然后我注意到我应该设置标签或者某些东西代表XML标签的属性。

这是因为Tree.labelField =" @ label"。


解决方案

因此我想了三个选择。

一个。编写一个在将Object解析为XML时有效的方法,添加label属性。

B中。编写具有label属性的动态XML,并迭代地将Object属性放到XML中。

℃。编写可以直接接受Object或JSON数据的原始树方法。


但是

这些太累了所以

d。你告诉我其他好的解决方案。

是我认为最好的方式。

我该怎么做,ActionScript Masters?

Sample code在evernote中(因为来自eclipse [flash builder]的复制和粘贴在缩进中非常糟糕...)

1 个答案:

答案 0 :(得分:1)

我解决了这个问题,但这个问题没有答案。所以我为你保留代码。

private function onCreationComplete(event:FlexEvent):void{
    app = S4M(this.parentApplication);
    var service:HTTPService;
    loadSubsymbols();

    // *************************************************
    // generateRequest
    // *************************************************
    function loadSubsymbols():void { 
        service = new HTTPService();
        var action_url:String = "subsymbols.json";
        service.url = api_url + action_url;
        service.method = "GET";
        service.addEventListener(ResultEvent.RESULT, httpResult); 
        service.addEventListener(FaultEvent.FAULT, httpFault);
        service.contentType = "application/json"
        service.headers = { Accept:"application/json" };
        service.send(); 
    } 
}

    // *************************************************
    // connectionSuccess 
    // *************************************************
    private function httpResult(event:ResultEvent):void {
        var json:String = event.result as String;
        var obj:Object = JSON.decode(json);
        var tree:Object = obj.tree;
        treeView.dataProvider = object2json(tree);
        //MonsterDebugger.trace(this, treeView.dataProvider);
        MonsterDebugger.trace(this, treeView.selectedItem.label);
    }

    // *************************************************
    // generateJSONfromObject
    // ************************************************* 
    private function object2json(node:Object):Object{
        var name:String = node.name;
        var children:Array = new Array();
        if(isThereChildren(node)){
            for(var child:String in node.children){
                children.push(object2json(node.children[child]));
            }
        }

        if(isThereSubsymbols(node)){
            children.push(object2json(node.subsymbols[0]));
        }

        if(doYouHaveSomething(node)){
            return {label: name, children: children}
        }else{
            return {label: name}
        }
    }

    private function isThereChildren(nd:Object):Boolean{
        return nd.children
    }

    private function isThereSubsymbols(nd:Object):Boolean{
        return nd.subsymbols
    }

    private function doYouHaveSomething(nd:Object):Boolean{
        return nd.children || nd.subsymbols
    }

    // *************************************************
    // connectionFailure
    // *************************************************
    private function httpFault(event:FaultEvent):void { 
        var faultstring:String = event.fault.faultString; 
        Alert.show(faultstring);
    }
  1. 连接JSON API
  2. 通过as3corelib.JSON.decode
  3. 对象的JSONtext
  4. 通过递归方法扫描和剪切对象结构(这有点困难)
  5. 为TreeId.dataProvider创建特定的JSON
  6. MonsterDebugger.trace(这个,某些东西)是好的。 新手,用这个。