0

子ツリーノードが選択されているときに、ルート以外のノードに動的に追加しようとしています。

これが私がそれを実装した方法です:

まず、ツリーにTreeStoreを設定し、次に子ツリーノードを動的に追加するために、ツリーコントローラーのitemexpandイベントで処理します。

//pThis is a NodeInterface obj of the selected node
itemexpand: function (pThis, pEOpts) {
      //type is an attribute that I added so that I know what type of node that got selected
      if (pThis.raw.type === 'Staff' && !pThis.hasChildNodes()) {
                    var staffNodeAry = [{text:"Teachers", type:"ChildStaff", leaf: false},
                                                     {text:"Principals", type:"ChildStaff", leaf: false}];          
                     pThis.appendChild(staffNodeAry); 
       }
}

「Staff」タイプで「Teachers」ノードと「Principals」ノードの両方を表示できるため、これは非常にうまく機能しましたが、これまでに見つかった2つの問題があります。

1)コンソールに次のエラーがあります:

Uncaught TypeError:未定義のプロパティ'internalId'を読み取ることができません

理由はわかりませんが、誰かが啓蒙できればそれは素晴らしいことです。

2)「Teachers」と「Principals」のいずれかを展開すると、itemexpandによって返されるNodeInterfaceobjに未定義のrawオブジェクトが含まれます。

だから私はこれを行うことができませんでした:pThis.raw.type

私の理解では、新しい子ノードを追加するために新しいTreeStoreを作成する必要はありません。NodeInterfaceに準拠するオブジェクトの配列を作成することで十分だと思いましたが、間違っている可能性があります。誰かが私を正しい方向に向けることができれば、それは素晴らしいことです。

ハンディ

より詳しい情報:

私がやったことは実際にはExtJs4のドキュメントに従っているので、これはExtJs4フレームワークのバグだと思います。

これもExtjs-4.1.0-rc3でテストしましたが、同じエラーが発生しました。

4

3 に答える 3

1

イベントitemexpandをイベントafteritemexpandに変更することで、この問題を解決しました。これを正当化する文書はありません。デバッガーは、ビューが itemexpand イベントをリッスンし、ノードを手動で追加するとうまくいかないことをすると私に言います...

質問番号 2 の場合: ロード操作の後にストアのリーダーによって作成されるため、生のオブジェクトはありません。したがって、手動でノードを追加すると、生のオブジェクトは存在しません。

http://docs.sencha.com/ext-js/4-1/#!/api/Ext.data.Model-property-raw

于 2012-10-09T17:09:22.993 に答える
1

.appendChild() 関数のドキュメントには次のように書かれています。

node : Ext.data.NodeInterface/Ext.data.NodeInterface[]
The node or Array of nodes to append

また、2 つのオブジェクトの配列を追加しようとしていますが、それらは「NodeInterface」インスタンスではありません。したがって、次のように適切に作成する必要があります。

var nodeToAppend1 = pThis.createNode({text:"Teachers", type:"ChildStaff", leaf: false});
pThis.appendChild(nodeToAppend1);

私は一年前に同じ過ちを犯したことを覚えているので、これが役に立てば幸いです.

于 2012-10-18T08:15:42.847 に答える
0

Ext.TreePanelが非同期に動作しているために発生すると思います。したがって、追加プロセスは次のとおりです。

  1. 子を追加し、仮想の子の葉をツリーに追加します。隅に赤いマークがあります
  2. ストアのCreateAPIを呼び出す
  3. 応答を受信します。success=trueの場合、仮想で変更します

変更の目的はinternakIdプロパティに設定されているため、この変更が発生した後にのみ新しい子を追加できます。再帰関数を記述して、ストアの追加イベントにバインドする方が良いと思います

 tree.getStore().on('update', addChild);

また

tree.getStore().load({
  success: function() { 
     addChild()
  });
于 2012-04-19T06:23:00.153 に答える