1

モノの配列を返すサービスがあります。モノには と がidありnameます。

これらをにロードしたいExt.tree.Panel。ここでは、サービスからの典型的な応答を模倣するデータ ストアを定義しました。ここでJSFiddle のデモを試すことができます。

以下のコードも含まれています。

Ext.define('Thing', {
    extend: 'Ext.data.Model',
    fields: ['id', 'name'],
});

var store = Ext.create('Ext.data.TreeStore', {
    model: 'Thing',

    // example service response (in reality, this would be JSON)
    root: {
        children: [
            {
                id: 1,
                name: 'Thing 1',
            },
            {
                id: 2,
                name: 'Thing 2',
            },
            {
                id: 3,
                name: 'Thing 3',
            },
        ],
    },

    listeners: {
        append: function(thisNode, newChildNode, index, eOpts) {
            if( !newChildNode.isRoot() ) {
                newChildNode.set('text', newChildNode.get('name'));
            }
        },
    },
});

Ext.create('Ext.tree.Panel', {
    renderTo: Ext.getBody(),
    store: store,
    rootVisible: false,
});

ご覧のとおり、このサービスは Thing のidandのみを返し、が通常期待するorのnameようなツリー ノード情報は返しません。childrenleafExt.data.TreeStore

サービスが応答として返すものを変更することはできません。不要なツリー ノード情報なしで、サービスを呼び出してモノのフラットな配列を取得できる点が気に入っています。このようなデータを単に必要としないこのサービスと通信する多くのアプリがあり、私は権力者からデータを変更する許可を得ていません。

残念ながら、childrenレスポンス内の各 Thing に対して要素が定義されていないため、Ext はノードを展開しようとすると次のエラーを発生させます (これは JSFiddle で自分で生成できます)。

Uncaught TypeError: Cannot call method 'indexOf' of undefined 

それで、私の質問は次のとおりです。どうすれば、応答で返送children(またはleaf)する必要がなくなり、このエラーを解決できますか? Thing をツリーにロードして展開できるようにしたいだけです (はい、リーフにすることはできません)。

4

2 に答える 2

0

それらの情報を自分で追加してください!

ちょっとした例(ブラウザからコンソールで簡単に試すことができます):

a = {b:23};
a.c = 25;
//a is now the same like {b:23, c:25}

ストアのafterRequestメソッドでは、たとえば次のように実行できます。

proxy: {
    type: 'ajax',

    url: 'xxx',

    listeners: {
        exception: function(proxy, response, options) {
            //error case
        }
    },

    afterRequest: function(request, success) {
        var resText = request.operation.response.responseText,
            allThings = Ext.decode(resText),  //Decodes (parses) a JSON string to an object
            things = allThins.children,       //Now we have an object an we can do what we want...
            length = things.length;

        for (var i = 0; i < length; i++) {
            things[i].leaf = true;
            things[i].expanded = true;
        }

        this.setRootNode(allThings); 
    }
}

これは単なる擬似コードですが、機能するはずです。デバッガーステートメントリンク)を設定して、実際に何が返されるかを確認してください。

これがお役に立てば幸いです。

于 2013-01-22T14:45:18.987 に答える
0

応答ストアを繰り返し処理し、子ノードを作成してみてください。次に、子供をルートノードに追加します

store.each(function(rec) {  
  var childNode ;  
  //Create a new object and set it as a leaf node (leaf: true)  
  childNode = Ext.create('Model_Name', {  
       id: rec.data.id,  
       name: rec.data.name,
       text : rec.data.name,  
       leaf : true,  
  });  
  // add/append this object to your root node  
  treepanel.getRootNode().appendChild(childNode );  
 }); 

詳細については、このリンクを確認してください

于 2013-06-17T18:17:54.510 に答える