跟我一起学extjs5(24--模块Form的自己定义的设计[2])

时间:2021-08-07 14:49:55

跟我一起学extjs5(24--模块Form的自己定义的设计[2])

        在本节中将要增加各种类型的字段,在增加字段的时候因为能够一行增加多个字段,因此层次结构又多了一层fieldcontainer。form里面的主要层次结构例如以下: form -- fieldSet -- fieldcontainer -- field。
        如今增加fieldcontainer的生成器的文件,在factory中增加文件FieldContainerFactory.js
/**
* 字段容器factory
*/
Ext.define('app.view.module.factory.FieldContainerFactory', { statics : { getContainer : function(container, module, formtype) { var result = {
xtype : 'fieldcontainer',
layout : 'hbox',
margin : '0 0 0 0',
items : []
};
for (var i in container) {
var field = container[i];
// 假设是空的位置
if (field.spacer) {
result.items.push({
xtype : 'fieldcontainer',
layout : 'anchor',
margin : '0 0 0 0',
flex : field.flex
});
} else {
var fieldDefine = module.getFieldDefine(field.tf_fieldId); var f = app.view.module.factory.FormFieldFactory.getField(fieldDefine,
field, formtype, module); var c = {
xtype : 'fieldcontainer',
layout : ( f.moduleName )
? (field.tf_width != -1 ? 'table' : 'hbox')
: 'anchor',
flex : field.tf_colspan,
items : []
};
if (c.layout == 'hbox')
c.margin = '0 0 5 0';
c.items.push(f); result.items.push(c);
}
}
return result;
}
}
});

如今要增加最后一个field的生成器,FormFieldFactory.js,此文件敢放在factory文件夹之下。

/**
* 用于生成form中的每个field
*/ Ext.define('app.view.module.factory.FormFieldFactory', { statics : {
labelDefaultWidth : 92,
dateDefaultSize : 14,
integerDefaultSize : 10,
moneyDefaultSize : 14,
/**
* 依据module定义,formField的定义,formtype来返回一个field的定义
*/
getField : function(fieldDefine, formField, formtype, module) { var field = {
name : fieldDefine.tf_fieldName,
fieldLabel : formField.fieldLabel
|| (formField.labelAhead ? formField.labelAhead : '')
+ fieldDefine.tf_title.replace(new RegExp('--', 'gm'), ''),
labelAlign : formField.labelAlign || 'right',
labelWidth : formField.labelWidth || this.labelDefaultWidth,
behindText : formField.behindText || fieldDefine.behindText
};
if (field.behindText && field.behindText == ' ')
delete field.behindText; if (formField.labelWidth)
field.labelWidth = formField.labelWidth;
if (formField.hideLabel)
field.hideLabel = true;
// 假设是隐藏字段
if (this.getIsHidden(fieldDefine, formField)) {
Ext.apply(field, {
xtype : 'hiddenfield'
});
return field;
} Ext.apply(field, this.getFieldXType(fieldDefine, field));
if (formField.tf_width == -1) {
delete field.size;
field.anchor = '100%';
} // 是否是必添字段
if (fieldDefine.tf_isRequired)
Ext.apply(field, {
allowBlank : false
}); return field;
}, /**
* 推断字段类型
*/
getFieldXType : function(fieldDefine, field) { switch (fieldDefine.tf_fieldType) {
case 'Date' :
return {
size : this.dateDefaultSize,
format : 'Y-m-d',
xtype : 'datefield',
submitFormat : 'Y-m-d'
}
case 'Datetime' :
return {
size : this.dateDefaultSize,
format : 'Y-m-d H:i:s',
xtype : 'datetimefield'
}
case 'Boolean' :
return {
xtype : 'checkboxfield',
inputValue : 'true'
};
case 'Integer' :
return {
minValue : -9999999999,
maxValue : 9999999999,
fieldStyle : "text-align:right",
size : this.integerDefaultSize,
xtype : 'numberfield',
enableKeyEvents : true,
listeners : {
keydown : function(field, e, eOpts) {
if (e.getKey() == Ext.EventObject.ENTER) {
var f = field.nextSibling('field[readOnly=false]');
if (!!f)
f.focus();
return false;
}
}
}
};
case 'Double' :
return {
size : this.moneyDefaultSize,
hideTrigger : true,
xtype : 'numberfield',
behindText : '元' };
case 'Float' :
return {
minValue : -9999999999,
maxValue : 9999999999,
size : this.moneyDefaultSize,
hideTrigger : true,
xtype : 'numberfield'
};
case 'Percent' :
return {
size : this.moneyDefaultSize,
xtype : 'numberfield',
// behindText : '%',
percent : true
};
case 'String' :
var len = fieldDefine.l;
if (len == 0 || len > 100)
return {
maxLength : len == 0 ? Number.MAX_VALUE : len,
enforceMaxLength : true,
anchor : '100%',
grow : true,
growMax : 200,
growMin : 40,
xtype : 'textareafield'
}
else
return {
maxLength : len,
size : len,
enforceMaxLength : true,
xtype : 'textfield',
enableKeyEvents : true,
listeners : {
keydown : function(field, e, eOpts) {
if (e.getKey() == Ext.EventObject.ENTER) {
var f = field.nextSibling('field[readOnly=false]');
if (!!f)
f.focus();
return false;
}
}
}
}; }
}, /**
* 推断是否是hidden字段
*/
getIsHidden : function(fieldDefine, formField) {
return (fieldDefine.tf_isHidden || formField.tf_isHidden)
}
}
});

上面的字段生成factory中省略了combo和选择父级字段属性的操作,仅仅生成字符型,数值型,布尔型和日期型的内容。


        如今还要改动一下fieldSet.js中的内容,使其增加FieldContainer,文件又一次公布一下:
/**
*
* 生成form中的一个fieldSet的类
*
*/
Ext.define('app.view.module.form.FieldSet', {
extend : 'Ext.form.FieldSet',
alias : 'widget.formfieldset', requires : ['app.view.module.factory.FieldContainerFactory',
'app.view.module.factory.FormFieldFactory'], defaultType : 'textfield',
defaults : {},
layout : 'anchor',
config : {
module : undefined, //  此模块的module定义
schemeGroup : undefined, // 定义了此fieldSet的属性以及以下须要加的字段
numCols : undefined,
formtype : undefined
}, initComponent : function() {
this.title = this.schemeGroup.tf_formGroupName;
this.collapsible = this.schemeGroup.tf_collapsible;
this.collapsed = this.schemeGroup.tf_collapsed; this.items = []; var containers = []; // 要计算一下有多少个container,假设col=2,那么二个一换行,或者指定换行
var hiddens = []; // 隐藏的字段
var container = [];
var c = 0; for (var i in this.schemeGroup.tf_groupFields) {
var field = this.schemeGroup.tf_groupFields[i];
var fieldDefine = this.getViewModel()
.getFieldDefine(field.tf_fieldId);
// 假设是隐藏字段,那么就直接放在隐藏字段的数组里
if (fieldDefine && fieldDefine.tf_isHidden) {
hiddens.push(field);
continue;
}
} for (var i in this.schemeGroup.tf_groupFields) {
var field = this.schemeGroup.tf_groupFields[i];
var fieldDefine = this.getViewModel()
.getFieldDefine(field.tf_fieldId);
if (fieldDefine && fieldDefine.tf_isHidden) {
continue;
}
// 设置tf_colspan假设是0,那么置为1,假设大于tf_colspan,置为tf_colspan
field.tf_colspan = field.tf_colspan ? field.tf_colspan : 1;
if (field.tf_colspan > this.numCols)
field.tf_colspan = this.numCols;
// 假设加上这一行,超出了numCols,那么就要分二行了
if (c + field.tf_colspan > this.numCols) {
if (this.numCols - c > 0)
container.push({
spacer : true,
flex : this.numCols - c
});
containers.push(container);
container = [];
container.push(field);
c = field.tf_colspan;
} else {
container.push(field);
c += field.tf_colspan;
if (c >= this.numCols || field.tf_isEndRow) {
if (this.numCols - c > 0)
container.push({
spacer : true,
flex : this.numCols - c
});
c = 0;
containers.push(container);
container = [];
}
}
}
if (container.length > 0)
containers.push(container);
// 生成每个container ,一个container中能够放置若干个字段,假设分栏是3,那就放3个
for (var i in containers) {
this.items.push(app.view.module.factory.FieldContainerFactory
.getContainer(containers[i], this.getViewModel(), this.formtype));
} // 增加隐藏的字段
for (var i in hiddens) {
var field = hiddens[i];
var fieldDefine = this.module.getFieldDefine(field.tf_fieldId);
var f = app.view.module.factory.FormFieldFactory.getField(
fieldDefine, field, this.formtype);
this.items.push(f);
} this.callParent(arguments);
}
})

BaseForm.js中也对buttons又一次定义一下,增加了一个保存按钮。

				this.buttons.push({
text : '保存',
itemId : 'save',
glyph : 0xf0c7
},{
text : '关闭',
itemId : 'close',
glyph : 0xf148,
handler : function(button){
button.up('window').hide();
}
});

ModuleController.js中的editRecord事件的处理函数也改动,添加了调用当前选中Grid中记录的函数。

	editRecord : function(button) {
var window = Ext.widget('basewindow', {
viewModel : this.getView().getViewModel()
});
window.down('baseform').setData(this.getView().down('modulegrid')
.getSelectionModel().getSelection()[0]);
window.show();
},

经过以上步骤,能够看到一个改动form的窗体例如以下,窗体的高度是自己主动适应的。


跟我一起学extjs5(24--模块Form的自己定义的设计[2])


        至此,一个依据form參数自己定义的基本界面搭建完毕了。对于简单的应用这样搭建已经足够了,对于复杂的field的配置,你能够把他描写叙述成属性值的配置,然后再入解释运行的代码,这样你能够完毕很多其它的定制功能。比方说如今的字段建筑面积后面的“平米”怎样增加,怎样增加各种类型的combo字段等等,我如今的这个解说仅仅提供一个自己定义的思路,有很多其它想法还要自己去实现。







跟我一起学extjs5(24--模块Form的自己定义的设计[2])的更多相关文章

  1. 跟我一起学extjs5(22--模块Form的自己定义的设计)

    跟我一起学extjs5(22--模块Form的自己定义的设计)         前面几节完毕了模块Grid的自己定义,模块Form自己定义的过程和Grid的过程类似,可是要更复杂一些.先来设计一下要完 ...

  2. 跟我一起学extjs5(25--模块Form的自己定义的设计[3])

    跟我一起学extjs5(25--模块Form的自己定义的设计[3])         自己定义的Form已经能够执行了,以下改一下配置,把Form里面的FieldSet放在Tab之下.改动一下Modu ...

  3. 跟我一起学extjs5(11--自己定义模块的设计)

    跟我一起学extjs5(11--自己定义模块的设计)        从这一节開始我们来设计并完毕一个自己定义模块.我们先来确定一个独立的模块的所能定义的一些模块信息. 下面信息仅仅是我自己在开发过程中 ...

  4. 跟我一起学extjs5(13--运行菜单命令在tabPanel中显示模块)

    跟我一起学extjs5(13--运行菜单命令在tabPanel中显示模块)         上面设计好了一个模块的主界面,以下通过菜单命令的运行来把这个模块增加到主界面其中. 在MainModule. ...

  5. 跟我一起学extjs5(37--单个模块的设计[5取得模块列表数据])

    跟我一起学extjs5(37--单个模块的设计[5取得模块列表数据])         写了几个月,总算有点盼头了,最终要从后台取得数据了.后台的spring mvc 和 service 仅仅能简单的 ...

  6. 跟我一起学extjs5(42--单个模块的数据新增方式)

    跟我一起学extjs5(42--单个模块的数据新增方式)         前面的章节中已经增加了一个自己定义的模块,而且能够进行数据的新增.改动.删除的操作了,在这个基础上就能够大作文章了. 这一节来 ...

  7. 22、手把手教你Extjs5(二十二)模块Form的自定义的设计[1]

    下面开始设计和完成一个简单的Form的自定义过程.先准备数据,在ModuleModel.js中的data属性下面,加入自定义Form的参数定义,下面的代码中定义了一个新的属性tf_formScheme ...

  8. 21、手把手教你Extjs5(二十一)模块Form的自定义的设计

    前面几节完成了模块Grid的自定义,模块Form自定义的过程和Grid的过程类似,但是要更复杂一些.先来设计一下要完成的总体目标. 1、可以有多个Form方案,对应于显示.新增.修改.审核.审批等功能 ...

  9. 跟我一起学extjs5(18--模块的新增、改动、删除操作)

    跟我一起学extjs5(18--模块的新增.改动.删除操作)         上节在Grid展示时做了一个金额单位能够手工选择的功能,假设你要增加其它功能.也仅仅要依照这个模式来操作即可了,比方说你想 ...

随机推荐

  1. ant+jmeter+crontab实现自动化性能测试

    准备工作: 1.下载jmeter(我下载的apache-jmeter-2.13.zip) 2.配置jmeter环境变量,即path前添加jmeter的bin路径) 3.下载ant(我使用的apache ...

  2. P - Atlantis - hdu1542(求面积)

    题意:rt 求面积......不计算重复面积(废话..)hdu1255 的弱化版,应该先做这道题在做那道题的. ******************************************** ...

  3. Slack 开源替代品 Rocket.Chat(聊天,文件上传等等)

    Rocket.Chat 是特性最丰富的 Slack 开源替代品之一. 主要功能:群组聊天,直接通信,私聊群,桌面通知,媒体嵌入,链接预览,文件上传,语音/视频 聊天,截图等等. Rocket.Chat ...

  4. require include 一个隐藏的用法:作用域。

    最近在研究php底层框架,奇怪的一点.控制器里为什么要把从model里获取的数据 需要$this->assign('items', $items); 这种形式模板文件里才可以调用到这个变量.控制 ...

  5. Intellij IDEA 安装和配置jrebel进行项目的热部署

    Jrebel 先介绍一下jrebel,jrebel是可以热部署项目的一个工具,更改代码自动部署并不需要重启项目(在spring中的controller中,增加.修改方法都是可以进行热部署而不需要重启的 ...

  6. python中selenium操作下拉滚动条方法汇总

    UI自动化中经常会遇到元素识别不到,找不到的问题,原因有很多,比如不在iframe里,xpath或id写错了等等:但有一种是在当前显示的页面元素不可见,拖动下拉条后元素就出来了. 比如下面这样一个网页 ...

  7. File类_常见的方法(获取系统根目录与指定目录的容量)

    获取系统根目录 import java.io.File; public class File_ListRoots { public static void main(String[] args) { ...

  8. Objective-C 基于Aspects

    JavaScriptCore没有禁,因为各种小程序都在用 网络下载文件没有禁

  9. 2018.08.28 洛谷P4360 [CEOI2004]锯木厂选址(斜率优化dp)

    传送门 一道斜率优化dp入门题. 是这样的没错... 我们用dis[i]表示i到第三个锯木厂的距离,sum[i]表示前i棵树的总重量,w[i]为第i棵树的重量,于是发现如果令第一个锯木厂地址为i,第二 ...

  10. 第二章 ConcurrentHashMap源码解析

    注:在看这篇文章之前,如果对HashMap的层不清楚的话,建议先去看看HashMap源码解析. http://www.cnblogs.com/java-zhao/p/5106189.html 1.对于 ...