2010-02-16 24 views
9

Tôi muốn biết làm cách nào tôi có thể kiểm tra các nút anh chị em của cây trong khi nhấp vào một nút cụ thể trong ExtJs.kiểm tra các nút con của cây khi cha mẹ được nhấp [ExtJS]

Tôi đã cung cấp id cho mỗi nút và tôi có thể truy cập vào id của nút được nhấp. sau đó làm thế nào tôi có thể tiến hành kiểm tra các nút con tự động?

ai đó hãy giúp tôi ..

Trả lời

7
// or any other way of getting hands on the node you want to work with 
var node = treePanel.getNodeById('your-id'); 
node.eachChild(function(n) { 
    n.getUI().toggleCheck(true); 
}); 

Nếu bạn muốn điều này để làm việc trên toàn bộ cây con của nút hiện tại, bạn sẽ phải làm một số đệ quy.

hội nhập sâu hơn một chút:

treePanel.on('checkchange', function(node, checked) { 
    node.eachChild(function(n) { 
     n.getUI().toggleCheck(checked); 
    }); 
}); 
+2

không hoạt động trong các phiên bản API mới hơn. đã thành công http://stackoverflow.com/questions/6579769/automatically-check-uncheck-all-subtree-nodes-in-extjs-tree-when-certain-node-ge – pahan

+0

Điều đó đúng. Đoạn mã trên là dành cho Ext JS 3, Ext JS 4 đã thay đổi API cây khá nhiều. –

+2

Vì vậy, nếu bạn không mở rộng các nút con, chúng sẽ không tải. Vì vậy, khi bạn gọi checkchange nó sẽ chỉ kiểm tra các nút con đã được nạp. Những gì tôi đã kết thúc làm là thêm node.expand (true); trước node.eachChild, do đó nó mở rộng tất cả các nút và sau đó sẽ kiểm tra tất cả chúng. – Grammin

0

Các JSON hay XML sẽ cần "kiểm tra" bất động sản thiết lập là true hoặc false khi phổ biến các nút. Tôi giả định rằng bạn đang sử dụng một AsyncTreeNode để làm điều này cho bạn. Nếu các nút cây được tạo mà không có thuộc tính được kiểm tra này, ExtJS sẽ không hiển thị nó với hộp kiểm.

5
function nodeCheck(node) { 
    node.eachChild(function(n) { 
     if(n.hasChildNodes()) 
      nodeCheck(n) 
     n.getUI().toggleCheck(false); 
    }); 
} 
var node = (tree.getSelectionModel().getSelectedNode()) ? tree.getSelectionModel().getSelectedNode() : tree.root; 
if(node) nodeCheck(node); 

Nó hoạt động tốt cho tôi;)

+0

Làm việc tốt! Ít nhất trong Chrome tôi không có lỗi sau: "Kích thước ngăn xếp cuộc gọi tối đa đã vượt quá" =) –

2

nghe: {

checkchange : function(node, checked) { 
    node.parentNode.cascadeBy(function(n){n.set('checked', checked);}); 
} 

}

1
function checkChange(node, checked, Object) { 
    node.cascadeBy(function(n) { 
     n.set('checked', checked); 
    }); 
} 
+0

Một số giải thích ngắn gọn sẽ hữu ích. –

-1

Hoặc, nếu như tôi, bạn cần phải tự động kiểm tra/bỏ chọn nút cha khi tất cả các nút lá con được chọn/bỏ chọn, bạn có thể thử điều này:

function (node, checked) 
{ 

    if (node.get('leaf')) 
    { 
     node = node.parentNode; 
     var siblingStateEqual = true; 
     node.cascadeBy(function (n) 
     { 
      if (n != node) { 
       if (n.get('checked') != checked) { 
        siblingStateEqual = false; 
       } 
      } 

     }); 

     if (siblingStateEqual == checked) 
     { 
      node.set('checked', checked); 
     } 

    } 
    else 
    { 
     node.cascadeBy(function (n) { n.set('checked', checked); }); 
    } 


} 
0

Câu trả lời của Mr C hoạt động tốt (ExtJS 4.2), nhưng một lỗi sẽ xảy ra khi các childnode của parentnode có 1 con. Đây là một chút cải tiến của tôi. Ai đó có thể cải thiện thêm

function (node, checked) { 

    if (node.isLeaf()) { 
     node = node.parentNode; 
     var siblingStateEqual = true; 
     if (node.childNodes.length == 1) { 
      siblingStateEqual = checked; 
     } else { 
      node.cascadeBy(function (n) { 
       if (n != node) { 
        if (n.get('checked') != checked) { 
         siblingStateEqual = false; 
        } 
       } 

      }); 
     } 

     if (siblingStateEqual == checked) { 
      node.set('checked', checked); 
     } 

    } 
    else { 
     node.cascadeBy(function (n) { 
      n.set('checked', checked); 
     }); 
    } 
} 
Các vấn đề liên quan