博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深入浅出ExtJS 第四章 表单与输入控件
阅读量:6308 次
发布时间:2019-06-22

本文共 20768 字,大约阅读时间需要 69 分钟。

  

1 4.1 制作表单 2   var form = new Ext.form.FormPanel({ 3     title:'form', 4     defaultType:'textfield', 5     buttonAlign:'center', 6     frame:true, 7     width:220, 8     fieldDefaults:{ 9       labelAlign:'right',10       labelWidth:7011     },12     tiems:[{      //子组件;13       fieldLabel:'文本框'  //文本框组件;14     }],15     buttons:[{16       text:'按钮'17     }]18   });19   form.render('form');

 

1 4.2 FormPanel和BasicForm详解2 FormPanel是Ext.Panel的一个子类;实际上,表单的功能是在Ext.form.BasicForm中实现的;在获得Ext.form.FormPanel之后,随时都可以用getForm()方法获得BasicForm对象;可以在获得的BasicForm上执行"提交"和"重置"等操作;3 可以把Ext.form.FormPanel放到Ext.Viewport中作为整个页面布局的一个部分,同时用items指定Ext.form.FormPanel内部的子组件;可以通过xtype来指定每个子组件的类型;

  

1 4.3 Ext支持的输入组件  2 4.3.1 控件继承图  3   >.Ext.from.Field  4     >1.Ext.form.Checkbox       //复选框  5        Ext.form.Radio          //单选框  6     >2.Ext.form.Hidden         //隐藏域  7     >3.Ext.form.TextField      //文本输入  8       >1.Ext.form.NumberField  //数字输入控件  9       >2.Ext.form.TextArea     //多行文本输入 10       >3.Ext.form.TriggerField //选择控件 11         >1.Ext.form.ComboBox   //下拉控件  12            Ext.form.TimeField  //时间选取控件 13         >2.Ext.form.DateField  //日期控件 14     >4.Ext.HtmlEditor          //编辑器控件 15  16 4.3.2 表单控件  17 Ext.onReady(function(){ 18   Ext.QuickTips.init();     //控件初始化; 20    21   var form = new Ext.form.FormPanel({ //实例化对象 22     buttonAlign:'center',             //按钮居中; 23     width:600, 24     title:'form', 25     frame:true,                       //为组件提供圆角边框; 26     fieldDefaults:{                   //对象内部的属性都会被应用到下面的实例中(注意优先级问题); 27       labelAlign:'right',             //右浮动; 28       labelWidth:70                   //宽度; 29     }, 30     items:[{                          //单个组件或者是组件集合; 31       xtype:'container', 32       layout:'column',                //布局为列; 33       items:[{ 34         columnWidth:.7, 35         xtype:'fieldset', 36         checkboxToggle:true,          //控件组 组头;用复选框来设置控件的展开和收缩; 37         title:'单纯输入',             //fieldset的legend; 38         autoHeight:true, 39         defaults:{width:300},         //应用所有的子组件的宽度; 40         defaultType:'textfield',       41         items:[{                      //单个组件 42           fieldLabel:'文本',          //域标签;文本域; 43           name:'text' 44         },{ 45           xtype:'numberfield', 46           fieldLabel:'数字', 47           name:'number' 48         },{ 49           xtype:'combo', 50           fieldLabel:'选择', 51           name:'combo', 52           store:new Ext.data.SimpleStore({ 53             fields:['value','text'],  //将模型的字段绑定到轴; 54             data:[ 55               ['value1','text1'], 56               ['value2','text2'] 57             ] 58           }), 59           displayField:'text',        // 60           valueField:'value',         //相关的数据值绑定到ComboBox; 61           mode:'local',               //? 62           emptyText:'请选择' 63         },{ 64           xtype:'datefield',          //带有日期选择器下拉框并会自动进行日期验证的日期输入表单项; 65           feildLabel:'日期', 66           name:'date' 67         },{ 68           xtype:'timefield',          //带有时间下拉框和自动时间验证的input表单项; 69           fieldLabel:'时间', 70           name:'tiem' 71         },{ 72           xtype:'textarea', 73           fieldLabel:'多行', 74           name:'textarea' 75         },{ 76           xtype:'hidden', 77           name:'hidden' 78         }] 79       },{ 80         xtype:'container', 81         columnWidth:.3, 82         layout:'form', 83         items:[{ 84           xtype:'fieldset', 85           checkboxToggle:true, 86           title:'多选', 87           autoHeight:true, 88           defaultType:'checkbox', 89           hideLabels:true, 90           style:'margin-left:10px;', 91           bodyStyle:'margin-left:20px;', 92           itmes:[{ 93             boxLabel:'穿暖', 94             name:'check', 95             value:'1', 96             checked:true, 97             width:auto 98           },{ 99             boxLabel:'吃饱',100             name:'check',101             value:'2',102             checked:true,103             width:'auto'104           }]105         },{106           xtype:'fieldset',107           checkboxToggle:true,108           title:'单选',109           autoHeight:true,110           defaultType:'radio',111           hideLabels:true,112           style:'margin-left:10px;',113           bodyStyle:'margin-left:20px;',114           items:[{115             boxLabel:'自由',116             name:'rad',117             value:'1',118             checked:true119           },{120             boxLabel:'爱情',121             name:'rad',122             value:'2'123           }]124         }]125       }]126     },{127       xtype:'container',128       layout:'form',129       items:[{130         labelAlign:'top',131         xtype:'htmleditor',132         fieldLabel:'在线编辑器',133         id:'editor',134         anchor:'98%',135         height:200136       }]137     }],138     buttons:[{139       text:'保存'140     },{141       text:'读取'142     },{143       text:'取消'144     }]145   });146 147   form.render('form');148 }) 149 150 4.3.3 基本输入控件Ext.form.Field151 Ext.form.Field是所有输入控件的基类;它定义了输入控件通用的属性和功能函数;152 >1.页面显示样式:clearCls/cls/fieldClass,它们分别用来定义不同状态下输入框采用的样式;153 >2.控件参数配置:autoCreate/disabled,它们主要用来设置输入控件生成的DOM内容和标签内容;154 >3.数据有效性校验:invalidText/msgFx,它们用来设置数据校验的方式以及如何显示错误信息;155   //这些控件默认会监听blur事件,如果校验失败,就会根据msgTarget中的设置显示错误信息;通常会被设置qtip,用QuickTip显示错误信息;其他参数值:title/side/under;156   var field1 = new Ext.form.Field({157     fieldLabel:'qtip',158     msgTarget:'qtip'159   });160   field1.markInvalid();161   //markInvalid()函数用来显示field校验出错样式;162 163 4.3.4 文本输入控件TextField164   //专门用来输入文本数据的输入控件;165   var text = new Ext.form.TextField({166     fieldLabel:'单行',    //

 

1 4.4 ComboBox详解  2   //Ext中提供的ComboBox与HTML中原生的select无任何关系,它是用div重写的;  3   4 4.4.1 ComboBox简介  5   var data = [             //二维数组,ComboBox将要显示的数据;  6     ['value1','text1'],  7     ['value2','text2']  8   ];  9  10   var store = new Ext.data.ArrayStore({   //将二维数组转成对象; 11     fields:['value','text'],   12     data:data 13   }); 14   store.load(); 15  16   var combo = new Ext.form.ComboBox({ 17     store:stroe,            //传入数据; 18     empty:'请选择', 19     mode:'local',           //设置:数据已经读取到本地了; 20     valueField:'value',     //读取store里的value(对应的在data里的value); 21     dispalyField:'text',    //读取store里的text(实际是data里的text); 22     triggerAction:'query',  //自动补全; 23     value:'value1',         //设置combo的value值; 24     renderTo:'combo'        //渲染到的必须是
25 }) 26 27 4.4.2 将Select转换成ComboBox 28 32 33 var combo = new Ext.form.ComboBox({ 34 emptyText:'请选择', 35 mode:'local', 36 triggerAction:'all', 37 transform:'combo' //把id="combo"的select的数据抽离出来;添加到ComboBox里; 38 }); 39 40 4.4.3 ComboBox结构详解 41 var combo = new Ext.form.ComboBox({ 42 ... 43 hiddenName:'comboId' //让ComboBox又增加了一个type="hidden"的input,并且它的name和id都是"comboId" 44 }); 45 //若没有设置hiddenName,ComboBox提交的都是用户看到的text值;设置之后,才可以向后台提交text对应的value值; 46 47 4.4.4 ComboBox读取远程数据 48 var store = new Ext.data.Store({ 49 proxy:{ 50 type:'ajax', 51 url:'xxx.txt', 52 reader:{ 53 type:'array' 54 }, 55 fields:[ 56 {name:'value'},{name:'text'} 57 ] 58 } 59 }); 60 61 var combo = new Ext.form.ComboBox({ 62 .. 63 mode:'remote', //读取远程数据; 64 }); 65 66 4.4.5 ComboBox高级设置 67 >1.添加分页功能 68 var combo = new Ext.form.ComboBox({ 69 .. 70 mode:'remote', //参数必须是remote;因为分页的前提是先到store中分批获取数据; 71 minListWidth:200, //下拉列表的宽度; 72 pageSize:5 //每次显示多少条记录; 73 }); 74 75 >2.是否允许用户自己填写内容 76 //ComboBox的显示框是一个type="text"输入框,所以默认可以输入数据的; 77 var combo = new Ext.form.ComboBox({ 78 ... 79 editable:false //禁止用户填写数据; 80 }); 81 82 4.4.6 监听用户选择的数据 83 //设置事件机制监听ComboBox的事件,从而获知用户选择了哪条数据; 84 combo.on('select',function(comboBox){ 85 alert(comboBox.getValue()+'-'+comboBox.getRawValue()); 86 //getValue():返回对象的value值(value); 87 //getRawValue():返回表单项的原始值(text); 88 }); 89 //on():要监听绑定的combo对象; 90 //select:要监听的事件;\ 91 //comboBox:是被监听的combo对象本身; 92 93 4.4.7 使用本地数据实现省/市/县级联 94 comboProvince.on('select',function(comboBox){ 95 var province = comboBox.getValue(); 96 if(province == '河北'){ 97 storeCity.proxy.data = dataCityHebei; //动态设置市; 98 }else if (province == '内蒙古'){ 99 storeCity.proxy.data = dataCityNeimenggu;100 }101 });102 comboCity.on('select',function(comboBox){103 var city = comboBox.getValue(); //动态设置区;104 if(city == "唐山"){105 storeCounty.proxy.data = dataCountyTangshan;106 }else{107 storeCounty.proxy.data = dataCountyUnknow;108 }109 });110 comboCounty.on('select',function(comboBox){111 alert(comboProvince.getValue()+'-'+comboCity.getValue()+'-'+comboCounty.getValue());112 });

  

1 4.5 复选框和单选框 2 4.5.1 复选框 3   var form = new Ext.form.FormPanel({ 4     title:'form', 5     buttonAlign:'center', 6     frame:true,         //提供圆角; 7     url:'xxx.jsp', 8  9     //Ext.form.Checkbox10     items:[{            //在表单中添加控件容器;    11       xtype:'fieldset', //控件组,包装一组输入域的容器;渲染为HTML的fieldset;12       title:'多选',     //渲染为fieldset的legend;13       autoHeigth:true,14       defaultType:'checkbox', 15       hideLabels:true,16       items:[           //在控件容器中添加复选框控件;17         {boxLabel:'多选一',inputValue:'1',checked:true},   //默认选中;18         {boxLabel:'多选二',inputValue:'2'},19         {boxLabel:'多选三',inputValue:'3'},20       ]21     }],22 23     buttons:[{24       text:'提交',25       handler:function(){26         form.getForm.submit();27       }28     }]29   });30   form.render('form');31 32 4.5.2 单选按钮33   //单选按钮是继承自复选框的,所以Checkbox中的所有功能都能在Radio中使用;34   items:[{35     xtype:'fieldset',36     title:'单选',37     defaultType:'radio',  //findField('radio')对应的field;38     hideLabels:true,39     items:[40       {boxLabel:'单选一',name:'radio',inputValue:'1',checked:true},41       {boxLabel:'单选二',name:'radio',inputValue:'2'}42       //具有相同name值的Radio控件会放在同一组;这样保证单选功能;43     ]44   }],45   buttons:[{46     text:'提交',47     handler:..48   },{49     text:'getGroupValue', //添加一个按钮;50     handler:function(){   //触发器;51       Ext.Msg.alert('信息',form.getForm().findField('radio').getGroupValue());52       //信息弹出框;获取radio的inputValue值;53     }54   }]55 56 4.5.3 CheckboxGroup和RadioGroup控件57   //为复选框和单选按钮控件实现各种复杂的排列方式;58   >1.横向排列59   {60     xtype:'checkboxgroup',  //默认横排;61     fieldLabel:'自动布局',62     ...63   }64   >2.竖向排列65   {66     xtype:'checkboxgroup',67     fieldLabel:'单列',  68     columns:1,              //显示为一竖列;69     ...70   }71   >3.多列排列72   {73     xtype:'checkboxgroup',  74     columns:3,              //显示为三竖列;75     vertical:true,          //垂直优先;76     itemsCls:'x-check-group-alt', //向组件添加Class;77     ...78   }

  

1 4.6 滑动条表单控件 2   //可以将滑动条作为一个表单空间爱你放在表单面板中进行布局,实现表单数据的修改/读取与提交功能; 3   >1.滑动条 4   var huadong = new Ext.form.FormPanel({ 5     widrth:400, 6     title:'滑动条控件', 7     bodyStyle:'padding:10px;', 8     renderTo:'container', 9     defaultType:'sliderfield',10 11     defaults:{12       anchor:'95%',13       tipText:function(thumb){14         return String(thumb.value)+'%';15       }16     },17     items:[{18       fieldLabel:'Sound Effects',19       value:50,20       name:'fx'21     },{22       fieldLabel:'Ambient Sounds',23       value:80,24       name:'ambient'25     }]26   });27 28   >2.多滑块滑动条29   var horizontal = new Ext.Slider({30     renderTo:'multi-slider-horizontal',31     width:214,32     minValue:0,33     maxValue:100,34     values:[10,50,90],35     plugins:new Ext.slider.Tip();36   })

  

1 4.7 表单布局 2 4.7.1 默认平铺布局 3   var form = new Ext.form.FormPanel({ 4     defaultType:'textfiled', 5     frame:true, 6     fieldDefaults:{ 7       labelWidth:60 8     }, 9     items:[{fieldLabel:'默认布局'}],10   });11 12 4.7.2 平分列布局13   //使用"layout:'column'"来说明下面要使用的是列布局;然后在items指定每列中使用'columnWidth'设置每列所占总宽度的百分比;14   //须手动指定使用layout:'form',这样才能在每列中正常显示输入框和对应标签;15   var from = new Ext.form.FormPanel({16     ..17     items:[{18       layout:'column',    //列布局;19       items:[{20         columnWidth:0.4,  //本列占总宽度的百分比;21         layout:'form',    //组件内部默认布局;22         defaultType:'textfield',//以下组件为文本输入控件;23         items:[24           {fieldLabel:'平分列1'},25           {fieldLabel:'平分列2'},26         ]27       }]28     }]29   });30 31 4.7.3 在布局中使用fielset32   //在标准HTML中,需把输入项都放到fieldset中,以此来显示分组结构;33   items:[34     xtype:'feildset',     //使用fieldset;35     title:'使用fieldset', //fieldset的legend;36     columnWidth:0.5,37     lsyout:'form',38     autoHeight:true,39     defaultType:'textfield',//定义以下组件xtype;40     items:[{fieldLabel:'汉字'}]41   ]42 43 4.7.4 在fieldset中使用布局44   //创建FieldSet对象,包含分列布局,再传入到FormPanel中;45 46 4.7.5 自定义布局47   //因为Ext.form.FormPanel继承自Ext.Panel,所以可以使用layout和items提供各种内部布局形式;48   //除了Ext.form.Field之类的输入控件外,还可以使用其他Panel来装饰表单;49   //使用xtype:'panel',在它里边使用img来显示图片;50   {51     ..52     items:[53       {fieldLabel:'文字',xtype:'textfield'},54       {xtype:'panel',html:'
'}55 ]56 }

  

1 4.8 数据校验  2   //在Firefox下校验失败,调用submit()也不会提交; 3   //在IE下必须先使用form.isValid()自行判断,如果返回false,就不能在调用submit(),否则仍然会将非法数据提交到后台; 4   Ext.QuickTips.init();   //提示功能所需函数; 5   new Ext.form.TextField({ 6     name:'text', 7     fieldLabel:'不为空', 8     allowBlank:false      //输入框不能为空; 9   });10 11 4.8.2 最大长度和最小长度12   new Ext.form.TextField({13     fieldLabel:'字符长度',14     name:'text',15     minLength:5,16     maxLength:1017   });18 19 4.8.3 借助vtype20   //为vtype设置属性,即可校验;21   new Ext.form.TextField({22     fieldLabel:'vtype校验',23     name:'text',24     vtype:'email/url/alpha/alphanum'25     //验证邮箱/网址/英文字符/英文字符和数字;26   });27 28 4.8.4 自定义校验规则29   //允许自定义一个regex对输入数据进行校验;30   new Ext.form.TextField({31     fieldLabel:'自定义校验',32     regex:/^[\u4E00-\u9FA5]+$/,33     regexText:'只能输入汉字'34   });35 36 4.8.5 NumberField校验37   //NumberField控件不允许用户输入不符合要求的数据;38   items:[{39     fieldLabel:'数字',40     xtype:'numberfield',  //数字控件;41     allowNegative:false,  //不允许负值;42     allowDecimals:false,  //不允许小数;43     decimalPrecision:4,   //精确到小数点后几位;44     minValue:0,45     maxValue:150,46     maskRe:/\d/           //阻止小数和符号的输入;47   }]48 49 4.8.6 使用后台返回的校验信息50   //在服务器返回的相应中可以包含校验失败的信息;51   items:[{52     fieldLabel:'输入框1',53     name:'text1'54   },{55     fieldLabel:'输入框2',56     name:'text2'57   }],58   buttons:[{59     text:'按钮',60     handler:function(){61       form.getForm().submit({62         success:function(form,action){63           Ext.Msg.alert('信息',action.result.msg);64         },65         failure:function(form,action){66           if(action.failureType == Ext.form.Action.SERVER_INVALID){67             Ext.Msg.alert('错误','后台校验失败');68           }else{69             Ext.Msg.alert('错误','无法访问后台');70           }71         }72       });73     }74   }]75   //通过actioin的failureType来判断响应失败是因为校验失败还是因为HTTP链接发生错误;76   >.后台响应信息77   {success:false,errors:{text1:'有问题1',text2:'有问题2'}}78   //errors对应一个JSON对象,里边包含的就是错误信息;与输入框的text1和text2对应起来,最终显示在页面上;

  

1 4.9 使用表单提交数据 2   >.一种原始的HTML表单形式的提交和两种Ajax形式的提交; 3 4.9.1 Ext默认的提交形式 4   Ext.onReady(function(){ 5     var form = new Ext.form.FormPanel({ 6       defaultType:'textfield', 7       title:'表单提交', 8       ... 9       url:'xxx.jsp',            //提交路径;10       items:[{11         fieldLabel:'文本框',12         name:'text'             //后台判断来自哪个控件;13       }],14       buttons:[{15         text:'提交',            //按钮显示文字;16         handler:function(){     //提交按钮调用函数;17           form.getForm.submit({ //为submit封装回调函数;18             //只有后台响应为true,或响应的JSON中包含success:true时,执行;19             success:function(form,action){  20               //参数直接调用form对象;21               //action可直接从返回信息中调用JSON数据 ↓↓22               Ext.Msg.alert('信息',action.result.msg);23             },24             failure:function(){25               //Ext规定:如果响应的JSON中的success不是true,并且JSON中包含errors:{},则是判断后的业务错误;26               //如果没有包含errors:{},则是链接失败;27               Ext.Msg.alert('错误','操作失败!');28             }29           })30         }31       }]32     });33     form.render('form');34   });35 36 4.9.2 使用HTML原始的提交形式37   //Ext默认的提交形式是不会进行页面跳转的;主要是"one page one application"的形式;38   //在Ext.form.FormPanel里找到form,在它上面调用submit()就可以了;39   //Ext动态生成了表单,却没有把action部分添加上;40   //所以需要修改按钮的handler函数↓↓↓41   handler:function(){42     form.getForm().getEl().dom.action = 'xxx.jsp';43     //Ext中所有的控件都有el,el都是有DOM的;这个DOM模型就是Ext控件在页面上真实对应的部分了;44     form.getForm().getEl().dom.submit();45     //应用了HTML原始的提交形式;46   }47 48 4.9.3 单纯Ajax49   //若使用外部Ajax,需要从中把字段的数据取出来;50   >.form.getValues():若参数是true,就返回JSON组装的字符串;若参数是false,就返回JSON对象;51   >.findField():获取表单里的控件;52   var text = form.getForm().findField('text');53   //用getValues(true)函数来配合Ajax获得数据;然后用Ajax传递给后台;最后判断回调;54   handler:function(){55     var text = form.getForm().findField('text');56 57     Ext.Ajax.request({58       method:'POST',59       url:'xxx.jsp',60       success:function(response){61         var result = Ext.decode(response.responseText);62         Ext.Msg.alert('信息',result.msg);63       },64       failure:function(){},65       params:form.getForm().getValues(true)66     })67   }68 69 4.9.4 文件上传70   //为Ext.form.Field设置inputType:'file'即可;71   var file = new Ext.form.FormPanel({72     ...73     title:'文件上传',74     fileUpload:true,75     items:[{76       xtype:'textfield',77       fieldLabel:'上传',78       name:'file',79       inputType:'file'80     }]81   })82 83 4.9.5 文件上传控件84   //FileUploadField更加美化了上传选择控件;85   var fileUpload = new Ext.form.FormPanel({86     ..87     title:'File Upload Field',88     fileUpload:true,89     items:[{90       xtype:'fileuploadfield',91       fieldLabel:'上传控件',92       name:'fielduploadfield'93     }]94   });

  

1 4.10 自动把数据填充到表单中 2   //使用Ext.data.JsonReader来负责数据的读取和转换操作; 3   [{text:'textField',number:12.34,dat:'2015-01-01',combo:1}] 4   //↑↑这里提供了JSON数据,表单中需要配置对应的reader↓↓; 5   var reader = new Ext.data.JsonReader({},[ 6     {name:'text',type:'string'}, 7     {name:'number',type:'float'}, 8     {name:'date',type:'date',dateFormat:'Y-m-d'}, 9     {name:'combo',type:'int'}10   ]);11   //现在将设置好的reader放到表单中,后台返回的JSON会在这里被JsonReader()转换成对应的数据类型,供表单使用;12   var form = new Ext.form.FormPanel({13     ..14     reader:reader,15     items:[{16       xtype:'textfield',17       fieldLabel:'文本',18       name:'text'19     },{20       xtype:'numberfield',21       fieldLabel:'数字',22       name:'number'23     },{24       xtype:'datefield',25       fieldLabel:'日期',26       name:'date'27     },{28       xtype:'combo',29       fieldLabel:'下拉',30       name:'combo',31       store:new Ext.data.SimpleStore({32         fields:['value','text'],33         data:[[1,'text1'],[2,'text2'],[3,'text3']]34       }),35       triggerAction:'all',36       valueField:'value',37       displayField:'text'38     }]39   })40   //当调用form.load()函数时,表单会使用Ajax去后台读取需要的数据;41   {42     text:'读取',43     handler:function(){44       form.getFomr().load({url:'xx2.txt'});45     }46   }47   //为load()传递一个url参数,指定读取数据的网址;这个网址返回的信息就是上面提到的用于向表单填充数据的JSON字符串;

 

转载于:https://www.cnblogs.com/yizihan/p/4239841.html

你可能感兴趣的文章
Swift 5将强制执行内存独占访问
查看>>
中台之上(二):为什么业务架构存在20多年,技术人员还觉得它有点虚?
查看>>
深度揭秘腾讯云低功耗广域物联网LPWAN 技术及应用
查看>>
与Jeff Sutherland谈敏捷领导力
查看>>
More than React(四)HTML也可以静态编译?
查看>>
React Native最佳学习模版- F8 App开源了
查看>>
云服务正在吞噬世界!
查看>>
阅读Android源码的一些姿势
查看>>
Web语义化标准解读
查看>>
一份代码构建移动、桌面、Web全平台应用
查看>>
高性能 Lua 技巧(译)
查看>>
区分指针、变量名、指针所指向的内存
查看>>
异步编程的世界
查看>>
最近话题火爆的四件事你知道不?
查看>>
SpringBoot整合MyBatis
查看>>
云计算产业如何率先推行信用管理?
查看>>
Android 类库书签更新(一)
查看>>
Unity3D Input按键系统
查看>>
简单的一条SQL,不简单的做事思维 NOT IN 、NOT EXISTS、LEFT JOIN用法差别 ...
查看>>
DataWorks:任务未运行自助排查
查看>>