`

初试extjs

阅读更多

最近老师的项目需要对一些网页做页面改动,想想如果单纯只是改改页面,对自己的技术水平没什么促进作用。所以花了几天时间拿extjs练了下手,也算稍稍了解了extjs。之前在yui和extjs之间犹豫了一下,两个都没接触过,不过听说extjs的中文资料会比较多,所以嘛...

实现了一个学习活动管理页面,主要包括查询、分页浏览和创建功能。功能比较简单,没什么复杂逻辑,还没做完,慢慢完善吧,先把代码记录下来,不然以后又没兴趣写了。对extjs的一些功能和api不大了解,中间绕了很多弯路,代码写得有点杂乱。

 

 

/**
 * 作者:garlic 日期:2010-07-29 版本:1.0 博客地址:http://wisesooner.iteye.com/
 * 功能描述:学习活动管理页面,主要包括查询、分页浏览、创建 备注:extjs版本为3.2.1
 */
Ext.onReady(function() {

	Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
	Ext.QuickTips.init();

	// 活动类别
	var aTypeCode = [['all', '全部类别'], ['forum', '讨论交流'], ['work', '上传作品'],
			['vote', '投票调查'], ['question', '提问答疑']];
	var typeNames=new Ext.data.Record(
		{all:'全部类别',
		forum:'讨论交流',
		work:'上传作品',
		vote:'投票调查',
		question:'提问答疑'}
	);

	var store = new Ext.data.Store({
				proxy : new Ext.data.HttpProxy({
							url : "/lc/extjs/getData.jsp"
						}),
				autoLoad : {
					params : {
						start : 0,
						limit : 9
					}
				},
				baseParams : {
					type : 'all'
				},// 公共参数,pagingBar和grid可以共用
				reader : new Ext.data.JsonReader({// 读取json数据
					root : 'activities',
					totalProperty : 'count'
				}, Ext.data.Record.create(['aId', 'aTitle', 'aType', 'aDes',
						'aTime', 'aViewUrl', 'aEditUrl', 'aDelUrl', 'uId',
						'uName', 'auth']))
			});
	/* 以下是中间面板,包括顶部的查询和创建,底部的分页和中间的分页面板 */
	// 底部工具条(分页工具条),注:把分页工具条加在分页面板中,看起来有点不好看,所以就把它放在中间面板中了
	var pagingBar = new Ext.PagingToolbar({
				pageSize : 9,
				displayInfo : true,
				displayMsg : '显示第 {0} 条到 {1} 条记录,一共 {2} 条',
				emptyMsg : '没有记录',
				store : store
			});
	// 顶部工具条——创建活动按钮
	var createBtn = new Ext.Button({
				iconCls : 'create-btn',
				text : '+ 创建活动',
				handler:function(){aCreatePage.show();}
			});
	// 顶部工具条——查询——活动类别选择框
	var combo = new Ext.form.ComboBox({
				displayField :'text' ,
				valueField:'type',
				typeAhead : false,
				mode : 'local',
				triggerAction : 'all',
				emptyText : '请选择类别',
				selectOnFocus : false,
				editable : false,
				store : new Ext.data.SimpleStore({
							fields : ['type','text'],
							data : aTypeCode
						}),
				width : 100
			});
	// 顶部工具条——查询——搜索按钮
	var searchBtn = new Ext.Button({
				iconCls : 'search-btn',
				handler:checkForm
			});
	searchBtn.setTooltip('查询');
	// 顶部工具条——查询——文本输入框
	var searchTxt = new Ext.form.TextField({
				id : 'search-name',
				width : 250,
				selectOnFocus : true,
				regex : /^.*\S+.*$/, // 不能为空
				regexText : '活动名称不能为空'
			});
	// 顶部工具条——查询(包含活动类别选择框、搜索按钮、文本输入框)
	var searchBar = new Ext.Toolbar({
				id : 'search-bar',
				autoHeight : true
			});
	searchBar.add('活动名称: ', searchTxt, '   ', combo, '  ', searchBtn, '->',
			createBtn, ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' // 试了几种方式,都没办法很好地为“创建活动”按钮设置右边距,只好用这个土方法,看起来很不爽,如果大家有什么好建议,可以推荐
	);
	// 中间分页面板——构造不带分页工具栏的grid
	var grid = new Ext.grid.GridPanel({
				store : store,
				trackMouseOver : true,
				disableSelection : true,
				loadMask : true,
				autoHeight : true,
				columnLines : true,
				border : false,
				// grid的列
				columns : [{
							header : "类别",
							dataIndex : 'aType',
							align : 'center',
							sortable : true,
							width : 75
						}, {
							header : "标题",
							dataIndex : 'aTitle',
							sortable : true,
							width : 150,
							renderer : renderTitle
						}, {
							header : "简介",
							dataIndex : 'aDes',
							width : 500,
							renderer : renderDes
						}, {
							header : "创建时间",
							dataIndex : 'aTime',
							sortable : true,
							align : 'center',
							width : 80
						}, {
							header : "创建者",
							dataIndex : 'uName',
							align : 'center',
							sortable : true,
							renderer : renderUserLink
						}, {
							header : "操作",
							dataIndex : 'aId',
							renderer : renderAction,
							align : 'center',
							width : 115
						}],
				viewConfig : {
					forceFit : true
				}
			});
	// 生成中间面板
	var centerForm = new Ext.form.FormPanel({
				id : 'centerForm',
				region : 'center', // a center region is ALWAYS required for
									// border layout
				deferredRender : false,
				activeTab : 0, // first tab initially active
				margins : '0 5 0 0',
				title : '活动列表 - 全部类别',
				autoScroll : true,
				bbar : pagingBar,
				tbar : searchBar,
				items : grid
			});

	// body视图
	var viewport = new Ext.Viewport({
				layout : 'border',
				items : [new Ext.BoxComponent({
									region : 'north',
									id : 'page-title',
									margins : '0 5 3 5',
									autoEl : {
										tag : 'div',
										html : '<h1>学习活动管理页面</h1>'
									}
								}), {
									region : 'west',
									id : 'west-panel',
									title : '按类别浏览',
									collapsible : true,
									margins : '0 0 0 5',
									autoScroll : true,
									width : 160,
									margins : '0 5 3 5',
									contentEl  :'typeNav'
								}, centerForm]
			});
	//创建活动的页面
	var aCreatePage= new Ext.Window({
		contentEl:'a_c_n',
		modal:true,
		draggable :false,
		width:700,
		height:400,
		border :false,
		resizable :false,
		plain:true,
		closeAction :'hide'
	});
    var aCreateForm = new Ext.form.FormPanel({
        labelWidth: 55,
        frame:true,
        labelSeparator:':',
        defaults: {
            xtype: 'textfield'
        },

        items: [{
            fieldLabel: '标题',
            width:450,
            emptyText : '请输入活动名称',
            regex : /^.*\S+.*$/, // 不能为空
			regexText : '活动名称不能为空'
        }, {
            xtype: 'textarea',
            fieldLabel: '简介',
            width:450,
            height:200,
            emptyText : '请输入活动简介',
            regex : /^.*\S+.*$/, // 不能为空
			regexText : '活动简介不能为空'            
        }]
    });

    var aCreateWindow = new Ext.Window({
        title: '创建活动',
        draggable :true,
        bodyStyle: 'padding:5px;',
        buttonAlign: 'center',
        items: aCreateForm,
        border :false,
		resizable :false,
		closeAction :'hide',
        buttons: [{
            text: '确定'
        },{
            text: '取消',
            handler:function(){aCreateWindow.hide();}
        }]
    });
    
	void function() {
		Ext.addBehaviors({
			'#typeNav a@click':function(e,t){getData(Ext.get(this).getAttribute('value'));},
			'#a_c_n dd@click':function(e,t){showCreateForm(Ext.get(this).getAttribute('value'));},
			'#a_c_n dd@mouseenter':function(e,t){Ext.get(this).addClass('over');},
			'#a_c_n dd@mouseleave':function(e,t){Ext.get(this).removeClass('over');}
		});
	}();
	//显示创建活动窗口
	function showCreateForm(){
		aCreatePage.hide();
		aCreateWindow.show();
	}
	//显示选择活动类型的页面
	function leadToCreatePage(){
		aCreatePage.show();
	}
	function renderTitle(value, p, record) {
		return String
				.format(
						'<a class="alink" title="查看" href="{1}" target="_blank">{0}</a>',
						value, record.data.aViewUrl);
	}
	function renderAction(value, p, record) {
		var viewStr, editStr, delStr;
		viewStr = String
				.format(
						'<a class="alink" title="查看" href="{1}" target="_blank">查看</a>',
						value, record.data.aViewUrl);
		editStr = String
				.format(
						'<a class="alink" title="编辑" href="{1}" target="_blank">编辑</a>',
						value, record.data.aEditUrl);
		delStr = String
				.format(
						'<a class="alink" title="删除" href="{1}" target="_blank">删除</a>',
						value, record.data.aDelUrl);
		return viewStr + editStr + delStr;
	}
	function renderDes(value, cell) {
		cell.attr = 'style="white-space:normal"';
		return value;
	}
	function renderUserLink(value, p, record) {
		return String
				.format(
						'<a class="alink" title="点击查看个人空间" href="/do/psTemplateUser?action=index&psUserId={1}" target="_blank">{0}</a>',
						value, record.data.uId);
	}
	function checkForm(){
		var keyword=searchTxt.getValue().trim();
		if(keyword==''){
			Ext.Msg.show({
			   title:'提示',
			   msg: '活动名称不能为空!',
			   buttons: {ok:'确定'},
			   icon: Ext.MessageBox.INFO,
			   modal:false,
			   fn:function(){
				searchTxt.setValue('');
				searchTxt.focus();
			   }
			});
			return false;
		}
		var type=combo.getValue()==''?'all':combo.getValue();
		getData(type,keyword);	
	}
	function getData(type,keyword) {
		if(type==undefined||typeof(type)!='string' ){
			type='all';
		}
		if(keyword==undefined||typeof(keyword)!='string' ){
			keyword='';
		}
		store.baseParams = {
			type : type,
			keyword:keyword
		};
		store.reload({
					params : {
						start : 0,
						limit : 9
					}
				});
		var title=typeNames.get(type);
		Ext.getCmp('centerForm').setTitle('活动列表 - '+title);
	}
	
	
});

 

 

界面图:

问题:

1、构造store的时候,跨越调用不行,还不知道为什么

2、左侧那几个button很是烦人,能不能根据数组动态生成

3、所有页面元素都是由引擎生成,看了下生成的html代码,感觉很冗余而且很多,不知道会不会影响页面加载速度,别人调试也不大好调,快速方便和灵活性有点冲突啊

4、ie和ff显示样式有点差别,ff的字体会好看点,ie下的字体有点刺眼,不知道该怎么改

 

html,body {

font: normal 12px verdana;

margin: 0;

padding: 0;

border: 0 none;

overflow: hidden;

height: 100%;

letter-spacing:1px;

}

5、分页面板最右端还多出来一列,怎么回事...

6、如果分页面板高度太高的,出现竖直滚动条的同时会出现水平滚动条.....

7、构造数据模型的时候,不知道该用哪种,用数组也不方便,用record也不方便,最后两个一起上,哎,烦躁

8、formpanel内部控件不能自动调整大小,如果加了属性layout: 'fit',个别控件又会撑得太大,把其他控件都挤没了

9、怎么把Ext.window的背景色弄成白色啊....搞了老半天都不行

 

注意事项:

1、store有个公共属性baseParams,可以传一些动态参数,方便不同控件(如分页面板、分页工具条)调用

2、tooltip如果要生效,必须在开头写上“Ext.QuickTips.init();”

3、分页面板中每一列默认都是不换行的,可以用css控制一下  white-space:normal

4、Ext.window的关闭按钮默认是remove,如果不想remove的话,得加上属性  closeAction:'hide'

5、在标签dd中加入mouseover和mouseout事件,ie下会出现闪烁,改成mouseenter和mouseleave,ie和ff都ok

			'#a_c_n dd@mouseenter':function(e,t){Ext.get(this).addClass('over');},
			'#a_c_n dd@mouseleave':function(e,t){Ext.get(this).removeClass('over');}

 

 

 

  • 大小: 242.5 KB
分享到:
评论

相关推荐

    初试extJs,控件

    ExtJs 是一种基于 JavaScript 的富客户端应用开发框架,主要用于构建桌面Web应用程序。它提供了一整套组件、布局管理和数据绑定机制,使得开发者可以方便地创建功能丰富的交互式用户界面。 在给定的代码中,我们...

    extJs3升级extjs4方案

    ExtJS3 升级到 ExtJS4 方案 ExtJS3 升级到 ExtJS4 需要修改大量代码,主要是因为 ExtJS4 配备了一类新的系统,不向后兼容。在 ExtJS 3 里生成表的几个框架组件,ExtJS4 大多生成 div,这使得 CSS classes 将会失败...

    extjs流程界面设计器参考_ExtJS工作流设计器_extjs工作流_extjs_

    ExtJS是一种广泛使用的JavaScript库,专门用于构建富客户端的Web应用程序。它提供了丰富的组件和工具,使得开发者可以创建出功能强大、用户界面友好的Web应用。在“extjs流程界面设计器参考”中,我们主要关注的是...

    轻松搞定Extjs 带目录

    本书作为Extjs的中文教程,旨在帮助读者快速上手Extjs,其内容涉及Extjs的基础知识和实际应用。 #### 2. JavaScript基础知识 - **类的定义**: Extjs中的类继承于JavaScript原生类,通过Ext.extend来定义。这是...

    ExtJS快速入门 ExtJS快速入门 ExtJS快速入门

    ExtJS快速入门 ExtJS快速入门 ExtJS快速入门 ExtJS快速入门 ExtJS快速入门 ExtJS快速入门 ExtJS快速入门 ExtJS快速入门 ExtJS快速入门 ExtJS快速入门 ExtJS快速入门 ExtJS快速入门ExtJS快速入门 ExtJS快速入门 ExtJS...

    Extjs 2.2 Extjs 3.21 js

    ExtJS是一种广泛使用的JavaScript库,专门用于构建富客户端Web应用程序。这个压缩包包含了ExtJS的两个重要版本:2.2和3.2.1。这两个版本在Web开发领域都有着广泛的运用,它们各自拥有不同的特性和改进,对于理解...

    ExtJs3.3中文API.CHM_extjs3.3中文文档_

    ExtJS是一个广泛使用的JavaScript库,专门用于构建富客户端应用程序。版本3.3是该库的一个稳定版本,提供了许多功能和组件,使得Web开发者能够创建功能丰富的、交互性强的用户界面。这个“ExtJS3.3中文API.CHM”文档...

    ExtJS 7.6 SDK trial

    ExtJS 是一个流行的JavaScript框架,用于构建富客户端的Web应用程序。它提供了丰富的用户界面组件、数据绑定机制和强大的API,使开发者能够创建功能强大的、响应式的桌面和移动应用。7.6版本是ExtJS的一个重要更新,...

    包含各种类型的extjs小图标,Extjs4小图标

    ExtJS 是一个流行的JavaScript框架,主要用于构建富客户端的Web应用程序。它提供了丰富的组件库、数据管理功能以及强大的用户界面(UI)元素。在标题和描述中提到的“Extjs4小图标”指的是ExtJS 4版本中使用的一系列...

    Extjs4.1 小例子(适合extjs初学者学习使用)

    ExtJS 是一个强大的JavaScript前端框架,用于构建富客户端应用程序。版本4.1是该框架的一个重要里程碑,提供了许多新功能和改进。对于初学者来说,理解并掌握ExtJS 4.1的基础和特性是非常有益的。 标题中的"Extjs...

    extjs电子书,extjs电子书,extjs电子书

    extjs电子书,extjs电子书,extjs电子书,extjs电子书

    ExtJS经典皮肤集合

    ExtJS是一款功能强大的JavaScript前端框架,它为开发者提供了构建富客户端Web应用的工具。这款框架以其丰富的组件库、可定制的界面和强大的数据绑定机制而闻名。标题中的"ExtJS经典皮肤集合"指的是该框架中包含的一...

    EXTJS讲解个人项目经历

    EXTJS 是一个强大的JavaScript前端框架,它主要用于构建富客户端应用,提供丰富的用户界面组件和灵活的可定制性。EXTJS 的核心在于其组件化的架构,允许开发者构建复杂的UI布局和功能丰富的应用程序。以下是对EXTJS...

    ExtJS 界面设计器

    ExtJS是一款强大的JavaScript库,主要用于构建富客户端的Web应用程序。其界面设计器,正如标题所示,是一种可视化的开发工具,能够极大地提升开发效率和用户体验。这个工具允许开发者通过拖放组件和直观地调整属性来...

    ExtJS4ExtJS5MD5 加密

    适用于ExtJS4、ExtJS5 MD5加密算法!

    extjsapi/extjs3.4

    extjsapi,extjs文档,api手岫

    extjs 3.4 开发前准备

    【EXTJS 3.4 开发前准备】 EXTJS 是一款强大的JavaScript库,主要用于构建桌面级的Web应用程序,提供丰富的用户界面组件和交互效果。3.4版本是EXTJS的一个重要里程碑,它提供了稳定的基础和丰富的组件库。本文将...

    extjs-OA extjs-oa

    一个extjs的OA项目 extjs-OA extjs-oaextjs-OA extjs-oa

    JBPM4 SSH EXTJS JBPM SSH EXTJS

    JBPM4 SSH EXTJS JBPM SSH EXTJS JBPM4 SSH EXTJS JBPM SSH EXTJS JBPM4 SSH EXTJS JBPM SSH EXTJS JBPM4 SSH EXTJS JBPM SSH EXTJS 希望对大家有帮助。

    ExtJs学习笔记 ExtJs Api

    适合ExtJs开发人员extjs技术上手以及深入

Global site tag (gtag.js) - Google Analytics