Fri Apr 26 2019 00:00:00 GMT+0000 (Coordinated Universal Time)
fieldcontainer使用
一直没有实现的布局样式,即文本输入框,跟按钮在一行内的布局,终于实现了。fieldcontainer有fieldLabel属性,属于整行的标签,这样整体布局不会乱。具体如下:
{
xtype: 'fieldcontainer',
layout: "hbox",
//1 注意下面,标签放在1位置跟2位置有很大的差别。
fieldLabel: '责任医生',
items: [{
xtype: 'textfield',
//2 这个标签就不用了。
flex: 1,
name: 'Doctor_Name'
}, {
xtype: "button",
text: "添加",
margin: '0 0 0 10',
handler: function () {
// me.priceProductWindow.show();
},
width: 100,
}]
}
另外,见别人这样写,利用panel作为容器,严格控制各个宽度,也能达到效果。代码如下:
{
xtype:"panel",
layout:"hbox",
height:30,
border:0,
items:[{
width:363,
xtype:'textfield',
labelWidth:70,
editable:false,
fieldLabel: SHINEECALL_PATIENT_PATIENTINFO_PATIENTFORM_PATIENT_DOCTOR,
labelAlign:"right",
name: 'Doctor_Name'
},{
xtype:"button",
text:SHINEECALL_PATIENT_PATIENTINFO_PATIENTFORM_SELECT_DOCTOR,
style:{
'margin-left':"10px",
width:"90px"
},
handler:function(){
}
}]
}
行编辑器中难排查的bug
一般来说store中的fields可以不写。但是在行编辑器中,store的fields字段必须要填。否则,context.record始终没有任何变化。而且还很难排查。
store:{
//行编辑器中的fields必须要填
fields:[
{name: 'Grade_ID',type: 'int'},
{name: 'Grade_Name',type: 'string'},
{name: 'Grade_Color',type: 'string'},
{name: 'Grade_Background',type: 'string'}
],
//否则下面的context,context.record始终没有变化,而且也没有触发验证
//记录上也没有红点。
listeners:{
"edit":function(editor, context, eOpts){
var me=this;
//点击保存触发ajax请求
var record =context.record;
console.log(record['data']);
表格渲染效果
一般常用renderer来进行数据的转换展示,比如,将1、2转换成男、女展示。但此函数还有很强大的功能,比如更改展示的效果,在renderer返回值中,添加要插入的图标,一并插入的展示中。下面两个示例。
- 结果转换,记得,这个转换好像会污染到变量。
renderer:function(v){
//下面的这个m也能使用全局或者类成员的属性,或者
//通过ajax从后台获取,完成 一对多的 联表效果(但是性能嘛,不高。)
var m={1:'男',2:'女'};
return m[v];
},
- 这个是通过返回值来进行更改效果。
{
text: "字体颜色",
width:100,
sortable: false,
dataIndex: 'Grade_Color',
editor: {
allowBlank: false//要求数据不能为空。
},
//这个是通过返回值来进行更改效果。
renderer:function(v){
var m = '<div style="background:'+v+'">'+v+'</div>';
return m;
}
},
- 通过metaData更改效果。 metaDa.tdCls 指定类名、metaData.tdStyle写css样式(能批量)、metaData.tdAttr指定一个属性(不能批量)。下面使用了两种方式:
{
text: "背景颜色",
width:100,
sortable: false,
dataIndex: 'Grade_Background',
editor: {
allowBlank: false//要求数据不能为空。
},
renderer:function(v,metaData){
//注意,下面是使用了 等号=
//这种只更改一种属性,写法比较简单。
metaData.tdAttr = 'bgcolor="' + v + '"';
return v;
}
},
{
text: "预览",
width:100,
sortable: false,
dataIndex: 'Grade_Background',
//metaData.tdStyle 可以直接写css,记得使用冒号:分隔,另外
//background-color不能写成backgroundColor,这个地方不会进行转换。
renderer:function(v,metaData,record){
var color=record.get('Grade_Color');
metaData.tdStyle='background-color:'+ v +';color:'+color+';';
return '示例效果';
}
},
dataview 选择功能
在查看dataview的帮助时,发现其有selectionModel这个属性。既然有这个属性,就想设置一些选择特性。但是遗憾的是,没有成功。虽然,用dataview的getSelection()、getSelectionModel()来获取,选择模型确实生效了,但是效果却没有。而且测试时,dataview的并未添加任何listeners事件。我猜测,可能跟选择模型有关,这个选择模型,可能没有这个功能。测试使用了其他的选择模型,没有报错,但是一样没有效果。
beforeselect方法,在选择边框的时候,也并不能触发。
看来还是只能使用以前的土方法呢。(之前记载过这个方法,即桌面版选择会议室功能)
由此,应该关注SelectionModel的使用方法。类的继承关系。
selectionModel:{
type: 'dataviewmodel',
allowDeselect:false,
mode : "MULTI" ,
toggleOnClick:true
}
但是,改进了dataview的保持选择一个的功能,可以不用引入一个变量保存上次选择的。直接用lastSelected
xtype:"dataview",
listeners:{
'selectionchange':function(cmp, selected, eOpts ){//只选择一个。
var selModel=this.getSelectionModel();
if(selected.length===0){//没有选择项,则不能取消
if(selModel.lastSelected){
selModel.select(selModel.lastSelected);
}
}
},
},
select 不要触发事件
第一次选择的时候,不希望触发select事件,之前想到过,使用一个标志位进行标记,但突然想到,框架里面好像有忽略触发消息的功能。然后隧完成如下。
如果不加这个参数,在这个颜色选择模块会造成事循环。
selectColor:function(){
var me=this;
var color = me.getValue();
var dv=me.popupWin.down('dataview');
var selRd=null;
dv.store.each(function(rd){//查找选中的record
if(rd.get('color')==color){
selRd=rd;
return false;
}
});
if(selRd){
//这个是初始化的时候,使用的,所以呢,应该忽略触发消息。
dv.getSelectionModel().select(selRd,false,true);
}else{
dv.getSelectionModel().deselectAll(true);
}
}
rowedit
对与每个editor而言,生命周期比较长,在rowedit所属的grid的销毁时,才销毁。