ExtJs で特定のノードをクリックしているときに、ツリーの兄弟ノードを確認する方法を知りたいです。
各ノードに ID を指定し、クリックしたノードの ID にアクセスできます。次に、子ノードを自動的にチェックするにはどうすればよいですか??
誰か私を助けてください..
// 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);
});
これを現在のノードのサブツリー全体で機能させたい場合は、再帰を行う必要があります。
もう少し統合:
treePanel.on('checkchange', function(node, checked) {
node.eachChild(function(n) {
n.getUI().toggleCheck(checked);
});
});
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);
それは私にとってはうまくいきます;)
リスナー:{
checkchange : function(node, checked) {
node.parentNode.cascadeBy(function(n){n.set('checked', checked);});
}
}
function checkChange(node, checked, Object) {
node.cascadeBy(function(n) {
n.set('checked', checked);
});
}
Cさんの回答は正常に動作します(ExtJS 4.2)が、親ノードの子ノードが1つの子を持つ場合にバグが発生します。これが私の少しの改善です。誰かがさらに改善できる
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);
});
}
}
JSONまたはXMLでは、ノードにデータを入力するときに「checked」プロパティをtrueまたはfalseに設定する必要があります。これを行うためにAsyncTreeNodeを使用していると想定しています。このチェックされたプロパティが存在しない状態でツリーノードが作成された場合、ExtJSはチェックボックスを使用してツリーノードをレンダリングしません。
または、私のように、すべての子リーフノードがチェック/チェック解除されているときに親ノードを自動的にチェック/チェック解除する必要がある場合は、これを試すことができます:
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); });
}
}