在项目中遇到要动态的增加删除一个组件,于是就查找资料,实现了下面的效果。

          Ext.onReady(function(){
// Ext.Msg.alert("提示","hello world")
var PanelCollect = null,
BusinessTimeArray = []; //营业时间段,该属性值为对象,格式: {start:'00:12',end:'01:30'} //营业时间控件进行对象
function CreateBusinessTimeControl(winObj,start,end) { //计算下一个时间控件显示的开始时间与结束时间
var winBusiness = "",
beginTime = start ? start : "00:00",
endTime = end ? end : "23:59"; var panelArray = winObj.items;
if (!start && !end && panelArray.length > 0) {
var len = panelArray.items.length,
lastTimeControl = panelArray.items[len - 1];
beginTime = lastTimeControl.query("[name=BusinessEndTime]")[0].rawValue;
if (beginTime === endTime) {
Ext.Msg.alert("温馨提示", "亲,已经到最后了,不能增加了");
return;
}
} var timePanel = Ext.create("Ext.panel.Panel", {
layout: "hbox",
bodyPadding: "5 0 5 0",
name: "timePanel",
frame:true,
border:0,
items: [{
xtype: "timefield",
altFormats: "H:i|G:i:s|H:i:s|g:i:s|h:i:s",
width: 200,
labelWidth: 100,
labelAlign: "right",
fieldLabel: "开始时间",
fieldName: "BusinessBeginTime",
format: "H:i",
name: "BusinessBeginTime",
increment: "30",
value: beginTime,
minValue: beginTime,
minText: "时间最小值不能小于{0}",
maxValue: endTime,
maxText: "时间最大值不能超过{0}",
//editable: true,
invalidText: "时间格式无效",
listeners: {
select:function (combo, records, eOpts ) {
console.log(records)
//开始时间必须小于结束时间
var endObj = this.nextSibling();
if(records>endObj.value)
{
var tempTime = endObj.value;
endObj.setValue(records);
this.setValue(tempTime);
}
}
}
}, {
xtype: "timefield",
altFormats: "H:i|G:i:s|H:i:s|g:i:s|h:i:s",
labelWidth: 60,
labelAlign: "right",
fieldLabel: "结束时间",
afterLabelTextTpl: "",
fieldName: "BusinessEndTime",
format: "H:i",
width: 160,
name: "BusinessEndTime",
increment: "30",
value: endTime,
minValue: beginTime,
minText: "时间最小值不能小于{0}",
maxValue: endTime,
maxText: "时间最大值不能超过{0}",
//editable: true,
invalidText: "时间格式无效",
listeners: {
select: function (combo, records, eOpts) {
var startObj = this.previousSibling();
//开始时间必须小于结束时间
if (startObj.value > records) {
var tempTime = startObj.value;
startObj.setValue(records);
this.setValue(tempTime);
}
}
}
}, {
xtype: "button",
text: "新增",
style: "margin:0px 0px 0px 10px ",
handler: function () {
//增加时间控件
CreateBusinessTimeControl(winObj)
}
}, {
xtype: "button",
text: "移除",
style: "margin:0px 0px 0px 10px ",
handler: function (obj) {
//移除时间选择
winObj.remove(obj.ownerCt, true);
winObj.doLayout();
}
}]
}); //增加控件
winObj.items.add(timePanel);
winObj.doLayout(); } //创建营业时间设置的窗体
function CreateBusinessTimeSettingWindow(){ var winBusinessTimeSetting = new Ext.Window({
title: '营业时间设置',
name: "winBusinessTimeSetting",
width: 500,
height: 460,
modal: true,
resizable: false,
closable: true,
layout: "vbox",
autoScroll:true,
items: [],
buttons: [{
text: "清空",
handler: function (obj) {
var winObj = obj.up("window"),
winItems = winObj.items;
if (winItems.length > 0) {
BusinessTimeArray = [];
while (winItems.items.length > 0)
{
winObj.remove(winItems.items[0], true);
}
winObj.doLayout();
}
}
}, {
text: "新增",
handler: function (obj) {
//添加一个时间选择组件
CreateBusinessTimeControl(obj.up("window"));
}
}, {
text: "完成",
handler: function (obj) {
//获取选中的所有时间段
var winItems = obj.up("window").items;
if(winItems.length>0)
{
var timeItems = winItems.items,
startTime = "",
endTime = "",
timeArray = []; for(var i=0;i<timeItems.length;i++)
{
startTime = timeItems[i].query("[name=BusinessBeginTime]")[0].rawValue;
endTime = timeItems[i].query("[name=BusinessEndTime]")[0].rawValue;
timeArray.push({ start: startTime, end: endTime });
}
BusinessTimeArray = timeArray;
//显示设置的营业时间值
ShowBusinessTime();
}
obj.up("window").close();
}
}]
}); winBusinessTimeSetting.show();
//显示已经设置的时间段
if (BusinessTimeArray.length > 0) {
for(var i=0;i<BusinessTimeArray.length;i++)
{
CreateBusinessTimeControl(winBusinessTimeSetting, BusinessTimeArray[i].start, BusinessTimeArray[i].end);
}
//显示设置的营业时间值
ShowBusinessTime();
} } //显示设置的营业时间值
function ShowBusinessTime(){ var strTimeArray = [],
strTime = "";
for(var i=0;i<BusinessTimeArray.length;i++)
{
strTimeArray.push(BusinessTimeArray[i].start + "~" + BusinessTimeArray[i].end);
}
//显示时间设置
if (strTimeArray.length > 4) {
strTime = "(已设置" + strTimeArray.slice(0, 4).join(",") + "...)";
} else {
strTime = "(已设置" + strTimeArray.join(",") + ")";
}
PanelCollect.query("[name=labelBusinessTime]")[0].el.dom.innerHTML = strTime; } PanelCollect = Ext.create('Ext.form.Panel', {
title: "外卖对接",
name: "ThirdWaimaiPanel",
bodyPadding: '20 10 10 10',
style: 'margin-top:5px',
layout: "vbox",
renderTo:Ext.getBody(),
defaults:{
bodyPadding: "10 0 0 0",
layout: 'hbox',
border:0,
},
width:600,
items: [
{
xtype: 'panel',
width: 500,
items: [{
xtype: "button",
text: "营业时间设置",
name: "btnBusinessTimeSetting",
width: 150,
height: 30,
handler: function () {
CreateBusinessTimeSettingWindow();
}
}, {
xtype: "label",
name: "labelBusinessTime",
style:"line-height:30px; margin-left:5px;",
html: "(未设置)"
}]
}
]
});
});

效果图如下:

Extjs动态增删组件的更多相关文章

  1. ExtJS动态创建组件

    J是代码动态创建dom: 或者 eval有后台组织代码,前台执 ======================= ExtJS组件的动态的创建: 程序中大多数时候需要在后台根据业务逻辑创建符合要求的组件, ...

  2. ExtJS 动态组件与组件封装

      介绍几个有用的函数: Ext.apply---追加配置选项Ext.reg,----注册xtypeExt.extend--扩展组件||操作({}|| cfg)fireEvent自定义事件机制 --- ...

  3. Java 动态编译组件 & 类动态加载

    1.JDK6 动态编译组件 Java SE 6 之后自身集成了运行时编译的组件:javax.tools,存放在 tools.jar 包里,可以实现 Java 源代码编译,帮助扩展静态应用程序.该包中提 ...

  4. 动态创建组件TEdit

    //动态创建组件TEdit procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;  Shift: TShiftSt ...

  5. Delphi动态创建组件,并释放内存

    开发所用delphi版本是xe2,效果图如下: 代码如下: ---------------------------------------------------------------------- ...

  6. extjs每一个组件要设置唯一的ID

    extjs每一个组件要设置唯一的ID,否则会造成各种错误 EXTJS基本上是靠ID来识别组件的,假如你在panel1中有个ID:"keyword"的textfield,而panel ...

  7. JS、JQuery和ExtJs动态创建DOM对象

    做了个简单使用JavaScript.JQuery.ExtJs进行DOM对象创建的测试,主要是使用JavaScript.JQuery.ExtJs动态创建Table对象.动态Table数据填充.多选控制. ...

  8. [extjs(2)] extjs第一个组件treepanel

    刚刚在接触extjs这个前段插件,由于公司是用这个来做前段的,所以有必要花点时间来掌握一下,下面是我自己的非常浅的学习总结,后期会慢慢添加的!! 一.TreePanel基本配置参数: animate: ...

  9. Angular动态创建组件之Portals

    这篇文章主要介绍使用Angular api 和 CDK Portals两种方式实现动态创建组件,另外还会讲一些跟它相关的知识点,如:Angular多级依赖注入.ViewContainerRef,Por ...

随机推荐

  1. SCCM2012 R2实战系列之十:解决WDS服务无法启动问题(错误1067:进程意外终止)

    在操作系统分发(OSD)之前需要开启PXE服务,然后会自动在SCCM服务器安装Windows Deployment Service. 但是之前在一次项目过程当中发现启用PXE服务后WDS无法启动,本以 ...

  2. 梯度下降(Gradient Descent)相关概念

    梯度,直观理解: 梯度: 运算的对像是纯量,运算出来的结果会是向量在一个标量场中, 梯度的计算结果会是"在每个位置都算出一个向量,而这个向量的方向会是在任何一点上从其周围(极接近的周围,学过 ...

  3. 提高modem的core dump级别

    zhangze@zhangze-OptiPlex-7040:~/e2_8939-E2-2104026-CTA/device/qcom/common$ git showcommit be2b5cb33a ...

  4. pthread mutex

    pthead_mutex_t mutex; 1:create: pthread_mutex_init(pthread_mutex_t* mutex, const pthread_mutexattr_t ...

  5. hadoop机群 运行wordcount出现 Input path does not exist: hdfs://ns1/user/root/a.txt

    机群搭建好,执行自带wordcount时出现: Input path does not exist: hdfs://ns1/user/root/a.txt 此错误. [root@slave1 hado ...

  6. Hadoop简介与分布式安装

    Hadoop的基本概念和分布式安装: Hadoop 简介 Hadoop 是Apache Lucene创始人道格·卡丁(Doug Cutting)创建的,Lucene是一个应用广泛的文本搜索库,Hado ...

  7. 安装部署elasticsearch

    ELK下载:https://www.elastic.co/downloads/ Beats:负责收集系统数据,可以直接发送到es中,也可以通过logstash中转 logstash:收集日志,为bea ...

  8. vue实现点击、滑动右侧字母对应各个城市

    1.字母组件给父组件传递当前点击的字母值 @click="handleLetterClick" //绑定事件 handleLetterClick (e) { //向上传递参数 th ...

  9. jmater分布式压力测试总结

    总结,总是为了方便以后 1.jmeter 2000个并发,4台slave ,每台slave是500个线程即可完成测试 2.jmx文件只需要拷贝到master下 jmeter目录下(最保险的方法) 3. ...

  10. 安全测试6_Web安全工具第一节(浏览器入门及扩展)

    今天来学习下浏览器的功能,浏览器是我们经常用到但是功能却很强大的一个东东,我们经常用到的无非是三种(谷歌.火狐.IE) 1.浏览器功能介绍: 下面以谷歌浏览器(Chrome版本为56)为例,介绍下,懂 ...