【问题标题】:ExtJS 4.2.1 TreePanel do not refresh how I wantExtJS 4.2.1 TreePanel 不刷新我想要的
【发布时间】:2013-07-18 18:00:15
【问题描述】:

我正在使用带有 ExtJS 4.2.1 的 treePanel。 我的问题很难解释。

我有两个按钮,一个树形按钮和一个清除按钮。

当我单击我的树按钮时,它会显示一个带有 checkNodes 的 treePanel,因此您可以检查一些节点。我的树形面板中有一个有效的按钮来验证选择。单击此按钮后,选中的节点(准确地说是离开,但这是一个细节)将被添加到面板中。此面板是一个网格,它是您检查过的节点的列表。这个网格没有问题。我对这个按钮和我的网格没有任何问题,当我单击有效按钮时,选中的节点会正确地列在我的网格面板中。

当我单击不在树面板中的清除按钮时,它会清除我的所有选择,我的网格变为空并且我的树中的所有节点都变为未选中状态(就像您从头开始一样)。

当我第一次这样做时它会起作用。我可以检查节点,单击有效按钮,它将正确地将我的项目添加到我的网格面板中(我的网格面板从未有任何问题,其中列出了我检查的节点)。如果我单击清除按钮,列表将变为空。然后,如果我点击我的树按钮,就会出现树面板,如果我展开它,我可以看到选择已重新初始化,所有节点都未选中。

问题:如果我第二次执行相同的操作,它似乎工作得很好,但是树面板没有重新初始化。我单击树按钮,树面板出现,当我展开它时,我看到我之前检查的节点仍然被检查。问题是,当我想用​​一些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();    
        });
});     

问题出在哪里?会是什么呢?为什么它只工作一次而不是两次?

谢谢

【问题讨论】:

    标签: extjs view tree refresh store


    【解决方案1】:

    您应该使用节点的 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();    
            });
    });
    

    【讨论】:

    • 我使用currentChild.set("checked", false); 指令更改了相关行。第一次执行操作时清除仍然有效(使我的树面板出现,检查节点,验证然后单击清除按钮以取消选中我的树的所有节点)当我想第二次执行此操作时,树面板出现完全清除,但第二次清除仍然不起作用。如果我想第三次做同样的操作,当我点击树按钮使我的树面板出现时,节点仍然处于选中状态。
    • 我不明白它是如何工作的一次但不能第二次,无论我如何转动它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-09
    • 2013-07-07
    • 1970-01-01
    • 2018-03-10
    • 2015-11-27
    相关资源
    最近更新 更多