ExtJs 4.2.1 复选框数据项动态加载(更新一下)
最近在做博客项目,后台管理用的是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 复选框数据项动态加载(更新一下)的更多相关文章
- easyui复选框树动态加载后台数据,实现自动选中数据库中数据。后台语言是.NET
最近公司做项目用到了easyui复选框树来实现加载不同类型产品.因为我刚刚毕业,现在也算是实习吧,所以一脸懵逼啊.在公司里的一个哥的帮助下 ,我写出来这个EasyUi复选框树了,虽然东西不难,但也是自 ...
- ListView总结(多选框ListViiew,动态加载,多线程更新ListView中的进度条)
Why ListView? ListView 如果仅仅出于功能上的需求ListView可能没有存在的必要,ListView能作的事情基本上ScrollView也能胜任.ListView存在的最根本的原 ...
- WindowsForm ComboBoxList 下拉框带复选框 可以动态添加
先来张效果图: 1.这里需要对控件进行重写,详细内容如下,对此不感兴趣的可以直接跳过这步,下载本人生成的dll,直接看第二小结,下载链接https://pan.baidu.com/s/1gfzrK5t ...
- extjs grid 复选框选择事件
开发中需求是统计选择的行数,所以要监控checkbox的选择事件包括表头的全选事件 遇到的问题就不赘述了 方案是监控grid的复选框和行加载时绑定事件 baseView: DBEN.controls. ...
- 表格中的checkbox复选框 全选非全选 公共方法 及提交选中结果
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- extjs 中动态给gridpanel 复选框赋值
最近在搞extjs时需要动态根据数据给gridpanel的复选框赋值 网上看了很多 ,多不行,最后找到一个好使的方法 如下: RBACformPanel.getSelectionModel().sel ...
- Extjs 3.4 复选框的,默认选中 ,禁用,(纯属于自己代码中需要,总结!)
var sm = new Ext.grid.CheckboxSelectionModel( { //一个特定的选择模型,它将渲染一列复选框,可以用来选择或反选多行数据. ...
- extjs 点击复选框在表格中增加相关信息行
功能效果:点击复选框在表格中自动增加相关信息行,复选框取消则表格中内容自动删除 初始效果大概是这样~~~~~ // 定义初始 存放表格数据 var gridItems = []; //省份复选框 va ...
- extjs下拉框添加复选框
给ComboBox组件配置listConfig 下拉框代码: var gyslxcm = Ext.create('Ext.form.field.ComboBox',{ id : 'gyslxcm', ...
随机推荐
- 【模拟,时针分针秒针两两夹角】【没有跳坑好兴奋】hdu - 5387 (多校#8 1008)
算是最好写的一道题了吧,最近模拟没手感,一次过也是很鸡冻o(* ̄▽ ̄*)o 注意事项都在代码里,没有跳坑也不清楚坑点在哪~ #include<cstdio> #include<cst ...
- Scala官方作弊条
Scala官方作弊条请参考:http://docs.scala-lang.org/cheatsheets/
- JMS - 消息选择器
消息选择器 将消息选择器应用在消费者,消费者就只会接受能通过过滤器的消息.消息选择器是基于 SQL-92 条件表达式语法的一个子集.消息选择器由三个元素组成:标识符.常量和标记运算符. 标识符 标识符 ...
- C#算法基础之希尔排序
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- Swift字典类
在Foundation框架中提供一种字典集合,它是由“键-值”对构成的集合.键集合不能重复,值集合没有特殊要求.键和值集合中的元素可以是任何对象,但是不能是nil.Foundation框架字典类也分为 ...
- Swift协议(Protocol)
协议是为方法.属性等定义一套规范,没有具体的实现. 协议能够被类.结构体等具体实现(或遵守). protocol SomeProtocol { // protocoldefinition goes h ...
- Objective-C(iOS)严格单例模式正确实现
注:本文所有权归作者所有,转载请注明出处 当希望在一个应用程序中某个类的对象只能存在一个的时候就可以考虑用单例模式来实现,单例模式在C++中比较容易实现(只需把构造函数声明为private),而在Ob ...
- XPath 初步讲解
2016-05-05 XPath是JavaScript 中节点查找手段,ie9以后的版本才支持w3c标准,其他浏览器基本支持.在e8之前的浏览器,通过基于 activeX的xml dom对象实现. 为 ...
- linux端口与进程命令
1 lsof命令 lsof -i:portNum 查出来与该端口相关的所有程序 2 netstat命令: netstat -lnp
- spring 计划任务:cron表达式
Cron表达式是一个字符串,字符串以5或6个空格隔开,分开工6或7个域,每一个域代表一个含义,Cron有如下两种语法 格式: Seconds Minutes Hours DayofMonth Mont ...