0

ExtJS 4.2.1 で treePanel を使用しています。私の問題は、説明するのが非常にデリケートです。

ツリーボタンとクリアボタンの2つのボタンがあります。

ツリー ボタンをクリックすると、checkNodes を含む treePanel が表示されるので、いくつかのノードを確認できます。選択を有効にするために、ツリーパネルに有効なボタンがあります。このボタンをクリックすると、チェックされたノード (正確には葉ですが、詳細です) がパネルに追加されます。このパネルはグリッドで、チェックしたノードのリストです。このグリッドで問題ありません。このボタンとグリッドに問題はありません。有効なボタンをクリックすると、チェックされたノードがグリッド パネルに正しく表示されます。

ツリー パネルにないクリア ボタンをクリックすると、すべての選択がクリアされ、グリッドが空になり、ツリーのすべてのノードがオフになります (最初から開始した場合のように)。

初めてやるときはうまくいきます。ノードをチェックし、有効なボタンをクリックすると、アイテムがグリッド パネルに正しく追加されます (チェックしたノードをリストするグリッド パネルに問題はありません)。クリア ボタンをクリックすると、リストが空になります。次に、ツリー ボタンをクリックすると、ツリー パネルが表示され、それを展開すると、選択が再初期化され、すべてのノードがオフになっていることがわかります。

問題 : 同じ操作を 2 度目に実行するとうまくいくように見えますが、ツリー パネルは視覚的に再初期化されません。ツリー ボタンをクリックすると、ツリー パネルが表示され、それを展開すると、以前にチェックしたノードがまだチェックされていることがわかります。問題は、チェックされたノードをいくつか調べたいときにconsole.log(currentChild.data.checked)、チェックされた値が であることがわかりますfalse

したがって、データで動作しているように見えますが、ツリー パネルが正しく更新されません (操作を複数回実行した場合のみ)。

私の問題が正しく説明されているかどうかわかりません。以下は該当するコードの一部です。

var uncheck = false;
button.on('click', function(){
        var treeSelector = createTree('stAddAction.do?action=product_tree_selector', 550, 490, '', 'lbl_st_tree_selection_empty', true, 'productlist');
        treeSelector.on('load', function( node, records, successful, eOpts ){
            if ( uncheck ){
                node.tree.root.cascadeBy(function(currentChild){
                    if ( currentChild.data.checked ){
                        currentChild.data.checked = false;
                        currentChild.raw.checked = false;
                        currentChild.triggerUIUpdate();
                        console.log(currentChild);
                    }
                });
            }
            uncheck = false;
        });
        buttonClear.on('click', function(){

           uncheck = true;  
           treeSelector.store.proxy.url = "stAddAction.do?action=product_tree_selector";
           treeSelector.store.load(treeSelector.getRootNode());
           treeSelector.store.sync();
           treeSelector.getView().refresh();    
        });
});     

問題はどこだ?どうなり得るか?1 回は機能するのに 2 回は機能しないのはなぜですか?

ありがとうございました

4

1 に答える 1

3

次のステートメントで値を変更するには、ノードの set メソッドを使用する必要があります。

currentChild.set("checked", false);

ここに完全なコードがあります:

var uncheck = false;
button.on('click', function(){
        var treeSelector = createTree('stAddAction.do?action=product_tree_selector', 550, 490, '', 'lbl_st_tree_selection_empty', true, 'productlist');
        treeSelector.on('load', function( node, records, successful, eOpts ){
            if ( uncheck ){
                node.tree.root.cascadeBy(function(currentChild){
                    if ( currentChild.data.checked ){
                        currentChild.set("checked", false);
                        console.log(currentChild);
                    }
                });
            }
            uncheck = false;
        });
        buttonClear.on('click', function(){

           uncheck = true;  
           treeSelector.store.proxy.url = "stAddAction.do?action=product_tree_selector";
           treeSelector.store.load(treeSelector.getRootNode());
           treeSelector.store.sync();
           treeSelector.getView().refresh();    
        });
});
于 2013-07-19T13:55:06.400 に答える