extjsアプリケーション内で物事を前後に移動する2つのボックスを備えたアイテムセレクターを作成しています。右側のボックスでは、アイテムを上下に移動するためのボタンを作成しています。基本的に、私はアイテムをその上または下のアイテムと交換しています。だから、私のコードはその点で簡単です
MoveUp: function(button, event, eOpts){
var theChosen = Ext.getStore('storeId').getRootNode().findChild('text', 'Chosen folder');
var chosenPanel = Ext.ComponenetQuery.query('#chosenTreePanel')[0];
var selected = chosenPanel.getSelectionModel().getSelection();
for( var i = 1; i < theChosen.childNodes.length; i++){
if(Ext.Array.contains(selected, theChosen.childNodes[i]) && (!Ext.Array.contains(selected, theChosen.childNodes[i-1]){
var temp = theChosen.childNodes[i];
theChosen.childNodes[i] = theChosen.childNodes[i-1];
theChosen.childNodes[i-1] = temp;
}
}
}
ボタンをクリックしてFirebugでDOMを確認した後、選択したノードが配列内で正しく移動したことがわかるため、このコードはすべて正常に機能しているようですが、この効果はツリーパネルに表示されません。???要素が変更されたときにツリーパネルを更新するにはどうすればよいですか。???
TreePanelの階層は、明確にするために次のようになります。
ルートノード'選択されたフォルダノード'フォルダ内で上下に移動しているアイテムの配列'フォルダ'
バージョン4.0.7を使用しています
replaceChild()を使用してイベントを発生させて再レンダリングしようとすると、期待どおりに動作しません。
変化:
var temp = theChosen.childNodes[i];
theChosen.childNodes[i] = theChosen.childNodes[i-1];
theChosen.childNodes[i-1] = temp;
に:
var temp = theChosen.childNodes[i];
theChosen.replaceChild(theChosen.childNodes[i-1], theChosen.childNodes[i]);
theChosen.replaceChild(temp, theChosen.childNodes[i-1]);
一部のノードが失われるという奇妙な動作が発生します。確かに私が探していたものではありません。ここでどこが間違っているのですか?
datachangedおよび(文書化されていない)refreshイベントを使用して次のコードを試しました。
Ext.getStore('storeId').fireEvent('datachanged', Ext.getStore('chosen') );
Ext.getStore('storeId').fireEvent('datachanged', Ext.getStore('chosen') );
これは何もリロードしません...
解決:
nodeInterface...のinsertChildメソッドを使用します。
上下に移動することに基づいてインデックスをさらに変更する必要があるという点で、insertChildの動作に奇妙なことに気づきました。以下のコードで説明します。
上に移動するには:
theChosen.insertChild( (i-1), theChosen.childNodes[i]);
下に移動するには:
theChosen.insertChild( (i+2), theChosen.childNodes[i]);
-1対+2ですが、どちらもアイテムを適切な方向に1つずつ効果的に移動します。