ExtJS4 组件化编程,动态加载,面向对象,Direct


Posted in Javascript onMay 12, 2011

ExtJS4推荐定义类的时候均使用Ext.define,利用xtype动态加载
修改了以前的一个登陆窗口,感觉用官方推荐的方法还是很不错的
但还有一些问题没有想得非常清楚,先把代码贴出来一起研究下。请看代码中的注释~~
使用Ext+.Net,用Direct模式传递数据
Default.aspx:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<title>ExtJS学习</title> 
<link rel="stylesheet" type="text/css" href="ext/resources/css/ext-all.css" /> 
<link rel="stylesheet" type="text/css" href="css/application.css" /> 
<script src="ext/ext-all.js" type="text/javascript"></script> 
<script src="ext/ext-lang-zh_CN.js" type="text/javascript"></script> 
<script type="text/javascript" src="ChcekLogin.ashx"></script> 
<script src="js/Ext.app.LoginFormPanel.js" type="text/javascript"></script> 
<script type="text/javascript" src="js/Ext.app.LoginDialog.js"></script> 
</head> 
<body> 
<div id="loading-mask"></div> 
<div id="loading"> 
<div class="loading-indicator"><img alt="" src="ext/resources/themes/images/default/shared/large-loading.gif" width="32" height="32" style="margin-right:8px;" align="absmiddle"/>正在加载...</div> 
</div> 
<script type="text/javascript"> 
//Ext.Loader.setConfig({ enabled: true }); 
Ext.onReady(function () { 
Ext.BLANK_IMAGE_URL = 'img/s.gif'; 
Ext.QuickTips.init(); 
Ext.Msg.minWidth = 300; 
//验证提示信息显示位置 
Ext.form.Field.prototype.msgTarget = 'side'; 
//如果是继承Ext.container.Viewport的实例,直接new出来就可以,会自动渲染到body 
//本例中Ext.app.LoginDialog继承自Ext.Window,需要调用show()方法才能显示 
new Ext.app.LoginDialog().show(); 
//250毫秒后删除加载提示信息 
setTimeout(function () { 
Ext.get('loading').remove(); 
Ext.get('loading-mask').fadeOut({ remove: true }); 
}, 250); 
})//onReady 
</script> 
</body> 
</html>

Ext.app.LoginDialog.js
//LoginDialog类,继承Ext.Window,上层对象使用new Ext.app.LoginDialog().show()动态实例化并显示。 
Ext.define('Ext.app.LoginDialog',{ 
extend:'Ext.Window', 
title: '登陆', 
plain: true, 
closable: false, 
closeAction: 'hide', 
width: 400, 
height: 300, 
layout: 'fit', 
border: false, 
modal: true, 
//使用xtype: 'LoginFormPanel'动态实例化Ext.app.LoginFormPanel,并使用api参数指定load和submit的服务器端方法。本例中只有submit 
items: {itemId: 'loginFormPanel',xtype: 'LoginFormPanel',api: {submit: MyApp.ChcekLogin.Check}} 
});

Ext.app.LoginFormPanel.js
//指定远程调用的Provider,注意不能在initComponent中指定,因为config属性设置是在initComponent之前,会报api找不到错误 
Ext.direct.Manager.addProvider(Ext.app.REMOTING_API); 
//loginForm类,继承Ext.form.FormPanel,使用alias注册至ComponentMgr,上层对象使用xtype:LoginFormPanel动态实例化。 
//form的submit()方法使用Direct提交,上层对象实例化本类的时候使用config中的api属性指定服务器端方法。 
//很奇怪的是不能在Ext.define或者Ext.apply中指定api属性,指定了实例化之后也会丢失,然后报url参数没有的错误,只能在上层对象实例化本类得时候使用config中的api属性指定api 
//如果在这里使用原始的new方法指定api也可以,是ext4中的问题?有谁知道的发mail告诉我,万分感谢~~ 
//使用Ext.define定义本类,定义中使用initComponent指定实例化之前需要执行的操作。 
//按面向对象编程思想,本类不调用任何上层对象,方法中不指定scope: this 
Ext.define('Ext.app.LoginFormPanel',{ 
extend:'Ext.form.FormPanel', 
initComponent: function(){ 
//初始化部分需要完成的功能 
//alert("Ext.form.FormPanel 开始加载……"); 
//貌似Ext.apply得来的属性和在Ext.define中定义的没什么区别,为什么要用这个呢?谁来教教我? 
Ext.apply(this, { 
//labelAlign: 'left' 
}); 
this.callParent(); 
}, 
alias:'widget.LoginFormPanel', 
labelAlign: 'left', 
buttonAlign: 'center', 
bodyStyle: 'padding:5px', 
frame: true, labelWidth: 80, 
items: [ 
{ xtype: 'textfield', name: 'txt1', fieldLabel: '用户名称', 
allowBlank: false, anchor: '90%', enableKeyEvents: true, 
listeners: { 
keypress: function (field, e) { 
if (e.getKey() == 13) { 
this.nextSibling().focus(); 
} 
} //keypress 
} 
}, 
{ xtype: 'textfield', inputType: 'password', name: 'txt2', fieldLabel: '用户密码', 
allowBlank: false, anchor: '90%', enableKeyEvents: true, 
listeners: { 
keypress: function (field, e) { 
if (e.getKey() == 13) { 
this.nextSibling().focus(); 
} 
} //keypress 
} 
}, 
{ xtype: 'textfield', name: 'txt3', fieldLabel: '验证码', 
allowBlank: false, anchor: '90%', mixLength: 6, maxLength: 6, enableKeyEvents: true, 
listeners: { 
keypress: function (field, e) { 
if (e.getKey() == 13) { 
this.ownerCt.submit(); 
} 
} //keypress 
} 
}, 
{ xtype: 'panel', height: 100, html: '<div style="margin:5px 0px 0px 84px"><a href="#"><img alt="如果看不清楚请单击图片更换图片。" onclick="this.src=\'vcode.ashx?d=\'+new Date();" id="code" height="82" width="242" src="vcode.ashx" border="0"></a></div>', border: false }, 
{ xtype: 'panel', height: 30, html: '<div style="margin:5px 0px 0px 84px;color:red">*如果图片不清晰请单击图片更换图片</div>', border: false } 
], //items 
buttons: [ 
{ text: '确定', handler: function () { this.findParentByType('LoginFormPanel').submit(); }}, 
//面向本对象编程,这里不要加入 scope: this,否则function会指定到window上面 
{ text: '重置', handler: function () { this.findParentByType('LoginFormPanel').form.reset(); } } 
], 
submit: function () { 
if (this.getForm().isValid()) { 
this.getForm().submit({ 
success: function (form, action) { 
window.location = "main.htm"; 
}, 
failure: function (form, action) { 
//使用form参数访问原submit的form 
form.reset(); 
//使用action.result访问结果集 
Ext.MessageBox.alert('登陆失败', action.result.data); 
} 
}) 
} 
} 
});

过程已经写到注释里面了,有什么问题请在下面讨论
Javascript 相关文章推荐
Javascript 二维数组
Nov 26 Javascript
JavaScript的setAttribute兼容性问题解决方法
Nov 11 Javascript
javascript事件冒泡实例分析
May 13 Javascript
JavaScript匿名函数之模仿块级作用域
Dec 12 Javascript
AngularJS中的Directive自定义一个表格
Jan 25 Javascript
ionic隐藏tabs的方法
Aug 29 Javascript
微信小程序  modal详解及实例代码
Nov 09 Javascript
bootstrap-datetimepicker实现只显示到日期的方法
Nov 25 Javascript
微信小程序使用slider设置数据值及switch开关组件功能【附源码下载】
Dec 09 Javascript
全面解析vue router 基本使用(动态路由,嵌套路由)
Sep 02 Javascript
一文看懂如何简单实现节流函数和防抖函数
Sep 05 Javascript
vue实现动态表格提交参数动态生成控件的操作
Nov 09 Javascript
关于js获取radio和select的属性并控制的代码
May 12 #Javascript
js 第二代身份证号码的验证机制代码
May 12 #Javascript
基于JQuery的动态删除Table表格的行和列的代码
May 12 #Javascript
五个jQuery图片画廊插件 推荐
May 12 #Javascript
JavaScript 继承使用分析
May 12 #Javascript
JS焦点图切换,上下翻转
May 12 #Javascript
js 中{},[]中括号,大括号使用详解
May 12 #Javascript
You might like
PHP操作xml代码
2010/06/17 PHP
php json相关函数用法示例
2017/03/28 PHP
PHP实现对数字分隔加千分号的方法
2019/03/18 PHP
PHP文件操作简单介绍及函数汇总
2020/12/11 PHP
显示、隐藏密码
2006/07/01 Javascript
Javascript 个人笔记(没有整理,很乱)
2007/07/07 Javascript
Jquery实战_读书笔记2 选择器
2010/01/22 Javascript
js使用正则实现ReplaceAll全部替换的方法
2014/08/22 Javascript
javascript操作字符串的原生方法
2014/12/22 Javascript
js 提交form表单和设置form表单请求路径的实现方法
2016/10/25 Javascript
巧用canvas
2017/01/21 Javascript
JS实现div模块的截图并下载功能
2017/10/17 Javascript
three.js中文文档学习之创建场景
2017/11/20 Javascript
vue获取dom元素注意事项
2017/12/28 Javascript
vue实现点击当前标签高亮效果【推荐】
2018/06/22 Javascript
解决Vue.js应用回退或刷新界面时提示用户保存修改问题
2019/11/24 Javascript
微信小程序实现音乐播放页面布局
2020/12/11 Javascript
Python NumPy库安装使用笔记
2015/05/18 Python
基于hashlib模块--加密(详解)
2017/06/21 Python
python基础教程项目五之虚拟茶话会
2018/04/02 Python
Python 获取div标签中的文字实例
2018/12/20 Python
python的pygal模块绘制反正切函数图像方法
2019/07/16 Python
python中的TCP(传输控制协议)用法实例分析
2019/11/15 Python
解决Pycharm中恢复被exclude的项目问题(pycharm source root)
2020/02/14 Python
python实现简单颜色识别程序
2020/02/19 Python
python解释器pycharm安装及环境变量配置教程图文详解
2020/02/26 Python
利用Python自动化操作AutoCAD的实现
2020/04/01 Python
Abe’s of Maine:自1979以来销售相机和电子产品
2016/11/21 全球购物
装潢设计实习自我鉴定
2013/09/19 职场文书
大学生励志演讲稿
2014/04/25 职场文书
家长建议怎么写
2014/05/15 职场文书
毕业纪念册寄语大全
2015/02/26 职场文书
七一活动主持词
2015/06/29 职场文书
Python使用random模块实现掷骰子游戏的示例代码
2021/04/29 Python
Python深度学习之Pytorch初步使用
2021/05/20 Python
Docker容器harbor私有仓库部署和管理
2022/08/05 Servers