最近在做博客项目,后台管理用的是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. C# 学习笔记01

    想写一个app可以访问数据库,实现对数据库的查询,修改等,突然发现知识实在有限,故选择C#来实现此app. 使用简单的三层架构来作为此app的架构.表现层(UI).业务逻辑层(BLL).数据访问层(D ...

  2. div a 和 div > a 的区别———后者指作用到div下一级的 a 标签 ,仅一级

    div a 和 div > a 的区别---后者指作用到div下一级的 a 标签 ,仅一级 如: <div> <a href="#">可以作用到< ...

  3. Jersey(1.19.1) - Conditional GETs and Returning 304 (Not Modified) Responses

    Conditional GETs are a great way to reduce bandwidth, and potentially server-side performance, depen ...

  4. AngularJS Tabular Data with Edit/Update/Delete

    效果 首先,我们先建立一些数据,当然你可以从你任何地方读出你的数据 var app = angular.module('plunker', ['ui.bootstrap']); app.control ...

  5. 小生功能贴<一> --- 动态添加应用 具有长按删除功能

    ---恢复内容开始--- 动态添加应用 具有长按删除功能 功能如下图:                (图片显示功能不是你要的,那就默默关闭页面吧) 设计思路: 页面一:用girdview网格显示图标 ...

  6. Win8、Win10进入SQL server配置管理器

    使用 WIN8.WIN10 访问 SQL Server 配置管理器 因为 SQL Server 配置管理器是 Microsoft 管理控制台程序的一个管理单元而不是单独的程序,所以,当运行 Windo ...

  7. 【转】Android属性之build.prop,及property_get/property_set

    简要分析一下build.prop是如何生成的.Android的build.prop文件是在Android编译时收集的各种property(LCD density/语言/编译时间, etc.),编译完成 ...

  8. oracle的to_number、to_char、to_date用法

    TO_DATE 是把字符串转换为数据库中得日期类型转换函数TO_CHAR 是把日期或数字转换为字符串TO_NUMBER 将字符转化为数字 TO_DATE使用TO_DATE函数将字符转换为日期TO_DA ...

  9. Objective-C 【点语法】

    ------------------------------------------- 点语法的使用 // //  点语法的使用 // //  点语法:   xcode的一种特性,xcode帮我们做代 ...

  10. 04_例子讲解:rlViewDemo.exe

    参考资料:http://www.roboticslibrary.org/tutorials/first-steps-windows 使用rlViewDemo对应的快捷方式启动程序,可以看到如下界面: ...