最近在做博客项目,后台管理用的是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

ExtJs 4.2.1 复选框数据项动态加载(更新一下)的更多相关文章

  1. easyui复选框树动态加载后台数据,实现自动选中数据库中数据。后台语言是.NET

    最近公司做项目用到了easyui复选框树来实现加载不同类型产品.因为我刚刚毕业,现在也算是实习吧,所以一脸懵逼啊.在公司里的一个哥的帮助下 ,我写出来这个EasyUi复选框树了,虽然东西不难,但也是自 ...

  2. ListView总结(多选框ListViiew,动态加载,多线程更新ListView中的进度条)

    Why ListView? ListView 如果仅仅出于功能上的需求ListView可能没有存在的必要,ListView能作的事情基本上ScrollView也能胜任.ListView存在的最根本的原 ...

  3. WindowsForm ComboBoxList 下拉框带复选框 可以动态添加

    先来张效果图: 1.这里需要对控件进行重写,详细内容如下,对此不感兴趣的可以直接跳过这步,下载本人生成的dll,直接看第二小结,下载链接https://pan.baidu.com/s/1gfzrK5t ...

  4. extjs grid 复选框选择事件

    开发中需求是统计选择的行数,所以要监控checkbox的选择事件包括表头的全选事件 遇到的问题就不赘述了 方案是监控grid的复选框和行加载时绑定事件 baseView: DBEN.controls. ...

  5. 表格中的checkbox复选框 全选非全选 公共方法 及提交选中结果

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  6. extjs 中动态给gridpanel 复选框赋值

    最近在搞extjs时需要动态根据数据给gridpanel的复选框赋值 网上看了很多 ,多不行,最后找到一个好使的方法 如下: RBACformPanel.getSelectionModel().sel ...

  7. Extjs 3.4 复选框的,默认选中 ,禁用,(纯属于自己代码中需要,总结!)

    var sm = new Ext.grid.CheckboxSelectionModel( {         //一个特定的选择模型,它将渲染一列复选框,可以用来选择或反选多行数据.         ...

  8. extjs 点击复选框在表格中增加相关信息行

    功能效果:点击复选框在表格中自动增加相关信息行,复选框取消则表格中内容自动删除 初始效果大概是这样~~~~~ // 定义初始 存放表格数据 var gridItems = []; //省份复选框 va ...

  9. extjs下拉框添加复选框

    给ComboBox组件配置listConfig 下拉框代码: var gyslxcm = Ext.create('Ext.form.field.ComboBox',{ id : 'gyslxcm', ...

随机推荐

  1. 简单遗传算法求解n皇后问题

    版权声明:本文为博主原创文章,转载请注明出处. 先解释下什么是8皇后问题:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法.在不 ...

  2. 如何将 Font Awesome 转成 PNG 图标 详细教程 含源代码

    最近因为项目上需要用到这个字体图标,但是它里面的许多也不能完全满足项目需要,因此就考虑将这个图标导出,然后自己再添加一些其他图标使用 搜索了些解决方案,如:http://www.oschina.net ...

  3. Quartz Scheduler(2.2.1) - Usage of SimpleTrigger

    SimpleTrigger should meet your scheduling needs if you need to have a job execute exactly once at a ...

  4. android——获取ImageView上面显示的图片bitmap对象

    获取的函数方法为:Bitmap bitmap=imageView.getDrawingCache(); 但是如果只是这样写我们得到的bitmap对象可能为null值,正确的方式为: imageView ...

  5. JQuery中操作表单和表格

    一:表单应用 1.HTML中的表单大致由三部分组成 (1).表单便签:包含处理表单数据所用的服务端程序URL,以及数据提交到服务器的方法. (2).表单域:包含文本框.密码框.隐藏域.多行文本框.复选 ...

  6. 【C语言】01-第一个c程序代码分析

    创建了一个C程序,接下来分析一下里面的代码. 项目结构如下: 一.代码分析 打开项目中的main.c文件(C程序的源文件拓展名为.c),可以发现它是第一个C程序中的唯一一个源文件,代码如下: 1 #i ...

  7. (转)实战Memcached缓存系统(1)Memcached基础及示例程序

    1.Cache定义 (1)狭义概念:用于CPU的相对高速处理与主存(Main Memory)的相对低速处理的之间起到协调功能的硬件设备. (2)广义概念:用于速度相差较大的两种硬件之间,起到协调两者数 ...

  8. 用sinopia搭建npm私服

    需求(这段话是摘抄参考文档的,因为作者也想这么说): 公司出于自身隐私保护需要,不想把自己的代码开源到包管理区,但是又急需一套完整包管工具,来管理越来越多的组件.模块和项目.对于前端,最熟悉的莫过于n ...

  9. php中类的声明与使用

    <?php /**php语言是支持面向对象编程的,对于面向对象的编程,学过java和C++的人都知道啊! *如果不清楚的去baidu问一下就可以了. */ //我们来定义一个类,定义类的关键字是 ...

  10. (转载)直接用SQL语句把DBF导入SQLServer

    告诉大家一个直接用SQL语句把DBF导入SQLServer,以及txt导入Access的方法,大家抛弃BatchMove吧来自:碧血剑告诉你一个最快的方法,用SQLServer连接DBF在SQLSer ...