最近在做博客项目,后台管理用的是ExtJs4.2.1版本,因为是初学所以在使用的时候也遇到不少的这样或那样的问题,也写了不少这方面的博客,今天要写的博客是关于复选框数据项动态的加载功能,以前也没用过,初次用,不知道怎么动态加载,静态加载很容易,添加itmes就可以了,于是我在网上找找有关这方面的博客,找到一篇,不过遗憾的是,这种方法太糟糕了,不是很方便,于是找到了一个很好的解决方法:
//点击编辑弹出的formpanel
var formPanel = new Ext.FormPanel({
//labelAlign: 'top',
bodyStyle: 'padding:5px 20px 0 5px',
autoScroll: true,
layout: 'form',
items: [
{
xtype: 'textfield',
id: 'title',
name: 'title',
anchor: '100%'
}, {
xtype: 'htmleditor',
id: 'context',
name: 'context',
border: true,
plugins: [
Ext.create('Ext.zc.form.HtmlEditorImage')
],
height: 400,
anchor: '100%'
}, {
xtype: 'checkboxgroup',
id: 'lblName',
name: 'lblName',
columns: 6,
border: true,
anchor: '100%'
}
],
buttonAlign: 'center',
buttons: [
{
text: '保存',
icon: '../../../Images/extjs/disk.png',
handler: function () {
var text = form.getForm().findField('context').getValue();
alert(text);
}
}, {
text: '关闭',
icon: '../../../Images/extjs/cross.png',
handler: function () {
win.close(this);
}
}
]
}); //通过extjs的ajax获取用户文章关联的标签数据
Ext.Ajax.request({
url: '/Manage/GetLableNameByUserIdAndArticleId',
params: {
articleid: rows[0].get('Id')
},
success: function (response) {
var obj = eval("(" + response.responseText + ")");
var len1 = obj.alldata.length;
var len2 = obj.data.length;
if (obj.data == null || len1 == 0) {
return;
}
var checkboxgroup = Ext.getCmp("lblName");
for (var i = 0; i < len1; i++) {
var checkboxObj = {
boxLabel: obj.alldata[i].Name,
name: 'cb-' + i,
checked: false
};
for (var j = 0; j < len2; j++) {
if (obj.alldata[i].Id == obj.data[j].Id) {
checkboxObj.checked = true;
}
}
var checkbox = new Ext.form.Checkbox(checkboxObj);
checkboxgroup.items.add(checkbox);
}
formPanel.doLayout(); //重新调整版面布局
}
}); //点击编辑弹出的windows(formpanel作为window的items)
var win = Ext.create("Ext.window.Window", {
title: "编辑", //标题
draggable: false,
icon: '../../../Images/extjs/pencil.png',
height: 600, //高度
width: 850, //宽度
layout: "fit", //窗口布局类型
modal: true, //是否模态窗口,默认为false
resizable: false,
items: [formPanel]
}); //给form赋值
formPanel.getForm().reset();
var contents = rows[0].get('Contents');
formPanel.getForm().findField("title").setValue(rows[0].get('Title'));
formPanel.getForm().findField("context").setValue(decodeURI(contents));
//window显示
win.show();
分析:
我现在讲解下,我是怎么动态加载复选框选项数据的,首先,初始化formpanel(formpanel里的数据项(items)创建了一系列的form(有textfield,htmleditor,checkboxgroup),创建完毕后,再通过Extjs的ajax获取数据项的数据(这个数据就是放在checkboxgroup里的)
var checkboxgroup = Ext.getCmp("lblName");
for (var i = 0; i < len1; i++) {
var checkboxObj = {
boxLabel: obj.alldata[i].Name,
name: 'cb-' + i,
checked: false
};
for (var j = 0; j < len2; j++) {
if (obj.alldata[i].Id == obj.data[j].Id) {
checkboxObj.checked = true;
}
}
var checkbox = new Ext.form.Checkbox(checkboxObj);
checkboxgroup.items.add(checkbox);
}
formPanel.doLayout(); //重新调整版面布局
然后,通过Ext.getCmp()方法,获取到刚才在formpanel里创建的checkboxgroup组件,然后通过for循环创建checkbox(这就是将刚才通过ajax获取的数据项数据进行初始化),然后,保存在checkboxgroup里面,接下来,就是最最重要的一步,当for循环结束后,你要重新调整版面布局,这时调用doLayout()方法,这样就动态的渲染到formpanel里的checkboxgroup里面,就完成了动态加载的效果!
//---------------------------------------更新部分--------------------------------------
注意:上面所述确实能够动态加载checkbox,但是(我最讨厌但是了),用form.submit()方法提交的时候不能够将选中的checkbox提交到后台(用上面的代码,有兴趣的可以试试),所以这种方法行不通,不过我又找到了一个新方法,点击这里查看。
//获取grid选中的数据
var sm = Ext.getCmp("gridPanel").getSelectionModel();
var rows = sm.getSelection();
if (!sm.hasSelection()) {
Ext.MessageBox.show({
title: '提示',
msg: '请选择一行数据进行操作!',
buttons: Ext.MessageBox.OK,
icon: Ext.MessageBox.INFO
});
return;
} var myCheckboxGroup;//定义checkboxgroup组件 //通过 Ext.Ajax.request()方法获取用户文章关联的标签数据
Ext.Ajax.request({
url: '/Manage/GetLableNameByUserIdAndArticleId',
async: false,
params: {
articleid: rows[0].get('Id')
},
success: function (response) {
var text = response.responseText;
var obj = eval("(" + text + ")");
var len1 = obj.data.alldata.length;
var len2 = obj.data.mydata.length; var myCheckboxItems = [];//创建checkbox 数据项
for (var i = 0; i < len1; i++) {
var checkboxObj = {
boxLabel: obj.data.alldata[i].Name,
name: 'cbLable',
inputValue: obj.data.alldata[i].Id,
padding: '0 20px 5px 0',
checked: false
};
for (var j = 0; j < len2; j++) {
if (obj.data.alldata[i].Id == obj.data.mydata[j].Id) {
checkboxObj.checked = true;
}
}
myCheckboxItems.push(checkboxObj);//保存checkbox 数据项
}
//新建checkboxgroup组件(将checkboxItems数据项作为它的数据项)
myCheckboxGroup = new Ext.form.CheckboxGroup({
xtype: 'checkboxgroup',
columns: 6,
items: myCheckboxItems
});
}
}); //点击编辑弹出的formpanel
var formPanel = new Ext.FormPanel({
//labelAlign: 'top',
bodyStyle: 'padding:5px 20px 0 5px',
autoScroll: true,
layout: 'form',
items: [{
xtype: 'textfield',
name: 'title',
anchor: '100%'
}, {
xtype: 'htmleditor',
border: true,
id: 'context',
plugins: [
Ext.create('Ext.zc.form.HtmlEditorImage')
],
height: 400,
anchor: '100%'
},
myCheckboxGroup
],
buttonAlign: 'center',
buttons: [
{
text: '保存',
icon: '../../../Images/extjs/disk.png',
handler: function () {
if (!formPanel.getForm().isValid()) {
return;
}
//
var opera = formPanel.getForm().getValues(true).replace(/&/g, ', ');
formPanel.getForm().submit({
url: '/Manage/SaveArticle',
method: 'get',
success: function (form, action) {
Ext.Msg.alert('Success', action.result.msg);
win.close(this);
},
failure: function (form, action) { }
});
}
}, {
text: '关闭',
icon: '../../../Images/extjs/cross.png',
handler: function () {
win.close(this);
}
}
]
}); //点击编辑弹出的windows(formpanel作为window的items)
var win = Ext.create("Ext.window.Window", {
title: "编辑", //标题
draggable: false,
icon: '../../../Images/extjs/pencil.png',
height: 600, //高度
width: 850, //宽度
layout: "fit", //窗口布局类型
modal: true, //是否模态窗口,默认为false
resizable: false,
items: [formPanel]
}); //给form重置后赋值
formPanel.getForm().reset();
var contents = rows[0].get('Contents');
formPanel.getForm().findField("title").setValue(rows[0].get('Title'));
formPanel.getForm().findField("context").setValue(decodeURI(contents));
//window显示
win.show();
又来总结一下:
其实他的解决思路是这样的:首先创建好checkbox和checkboxgroup然后再创建formpanel,再将之前创建好的checkboxgroup作为formpanel的items,这样,就没有问题了,而我之前做的是先创建formpanel然后再动态添加checkbox,再doLayout(),这样只能显示,而不能获取(不推荐)!所以这种方法解决了问题,不过还有一个小的技术点要提醒一下就是使用Ext.Ajax.request()方法的时候要设置为同步async: false,否则则出现,checkbox不显示,道理很简单,因为ajax是异步的所以当面板加载后才去创建checkboxgroup,这样当然就不行了,跟我之前的问题也差不多,希望大家不能犯我一样的错!
2014-03-20