[
{text:'01',children:[
{text:'01-01',leaf:true},
{text:'01-02',children:[
{text:'01-02-01',leaf:true},
{text:'01-02-02',leaf:true}
]},
{text:'01-03',leaf:true}
]},
{text:'02',leaf:true}
]
然而,有的时候我们会得到如下格式的JSON:
{
data:[
{text:'01',children:[
{text:'01-01',leaf:true},
{text:'01-02',children:[
{text:'01-02-01',leaf:true},
{text:'01-02-02',leaf:true}
]},
{text:'01-03',leaf:true}
]},
{text:'02',leaf:true}
]
}
其中data对应的值就是树形需要的节点数据,我们可以修改下TreeLoader函数,如:
var loader = new Ext.tree.TreeLoader({dataUrl:''});
loader.processResponse = function(response, node, callback, scope){
var json = response.responseText;
try {
var json = eval("("+json+")");
node.beginUpdate();
//从json中获得json数组
var o = json["data"];
for(var i = 0, len = o.length; i < len; i++){
//可以在此处进行相关数据转换
var n = this.createNode(o[i]);
if(n){
node.appendChild(n);
}
}
node.endUpdate();
if(typeof call == "function"){
callback(this,node);
}
}catch(e){
this.handleFailure(response);
}
};
如果,获得的JSON中没有text等key的话,那么,可以在for循环中进行相关数据转换。
var grid = new Ext.tree.ColumnTree({
id : 'grid',
border : false,
rootVisible : false,
autoScroll : true,
useArrows : true,
checkModel : 'cascade',
onlyLeafCheckable : false,
root : root,
columns : [{
header : "Header",
dataIndex : 'header',
sortable : true
},
....
],
loader:new Ext.tree.TreeLoader({
dataUrl:'',
uiProviders:{
'col':Ext.tree.ColimnNodeUI
}
})
});
如果如上面树中一样需要转换数据的话,那么需要在创建节点的时候在节点中添加” uiProvider”、”cls”、” iconCls”属性值。
var root = new Ext.tree.AsyncTreeNode({text:'我是根'});
改后的根节点定义:
var root = new Ext.tree.TreeNode({text:'我是根'});
就可以了。
同事在表单中用到了RadioGroup,但是却是获得不到值。上网查了些资料,重载如下代码即可获得值:
Ext.override(Ext.form.RadioGroup, {
getValue : function() {
var v;
if (this.rendered) {
this.items.each(function(item) {
if (!item.getValue()) {
return true;
}
v = item.getRawValue();
return false;
});
} else {
for (var k in this.items) {
if (this.items[k].checked) {
v = this.items[k].inputValue;
break;
}
}
}
return v;
},
setValue : function(v) {
if (this.rendered) {
this.items.each(function(item) {
item.setValue(item.getRawValue() == v);
});
} else {
for (var k in this.items) {
this.items[k].checked = this.items[k].inputValue == v;
}
}
}
});
5、 树中多选框在图标后面问题ExtJs2中,如果树节点有checkbox,checkbox会在节点的图标后面。这个相对应ExtJs4难看了。如何更改呢?首先想到的就是更改TreeNodeUI。好吧!查看代码后,发现其实只要把图标位置和checkbox位置对调就行了。然后,对调两个位置,测试发现显示出来的结果是自己想要的。但是呢,怎么都不能打上勾…..再认真看代码,发现了:
var i = this.elNode.childNodes;
this.indentNode = i[0];
this.ecNode = i[1];
this.iconNode = i[3];
var h = 3;
if (g) {
this.checkbox = i[2];
this.checkbox.defaultChecked = this.checkbox.checked;
h++
}
好吧,知道了吧!它是根据顺序来的…..
Ext.override(Ext.tree.TreeNodeUI, {
renderElements : function(e, l, k, m) {
this.indentMarkup = e.parentNode
? e.parentNode.ui.getChildIndent()
: "";
var g = typeof l.checked == "boolean";
var c = l.href ? l.href : Ext.isGecko ? "" : "#";
var d = [
'',
'',
this.indentMarkup,
"",
'',
g
? (''
: "/>"))
: "", '',
'', e.text, "",
' ',
" "].join("");
var b;
if (m !== true && e.nextSibling && (b = e.nextSibling.ui.getEl())) {
this.wrap = Ext.DomHelper.insertHtml("beforeBegin", b, d)
} else {
this.wrap = Ext.DomHelper.insertHtml("beforeEnd", k, d)
}
this.elNode = this.wrap.childNodes[0];
this.ctNode = this.wrap.childNodes[1];
var i = this.elNode.childNodes;
this.indentNode = i[0];
this.ecNode = i[1];
this.iconNode = i[3];
var h = 3;
if (g) {
this.checkbox = i[2];
this.checkbox.defaultChecked = this.checkbox.checked;
h++
}
this.anchor = i[h];
this.textNode = i[h].firstChild
}
});