Extjs-实用工具 Ext.Template()

本文介绍了Ext JS中的模板使用方法,包括基础模板、复杂模板XTemplate、输出后台数据、创建下拉框及判断功能应用。

1.Ext.Template()

模版中的数据索引是从0开始的,创建新模版之后必须调用compile()函数进行编译

效果图

代码
<%@ page language="java"  pageEncoding="UTF-8"%>
<%	String rootpath = request.getContextPath();%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
	<link rel="stylesheet" type="text/css" href="<%=rootpath%>/ext/resources/css/ext-all.css"/>
	<script type="text/javascript" src="<%=rootpath%>/ext/adapter/ext/ext-base.js"></script>
	<script type="text/javascript" src="<%=rootpath%>/ext/ext-all.js"></script>
	<script type="text/javascript" src="<%=rootpath%>/ext/ext-all-debug.js"></script>
	<script type="text/javascript" src="<%=rootpath%>/ext/ext-lang-zh_CN.js"></script>
	<style type="text/css">
		.red {
		    background: red;
		}
    </style>
	<script type="text/javascript" defer>
		Ext.onReady(function (){
			var data = [
				['1','male','李文超','李文超描述'],
				['2','female','蛋蛋','蛋蛋描述'],
				['3','male','道士','道士描述'],
				['4','female','懒蛋','懒蛋描述'],
				['5','male','吖男','吖男描述']
			];
			//我们还可以使用Ext.util.Format中预定义的格式化函数对原始数据进行格式化,比如trim
			var t = new Ext.Template(
				'<tr>',
					'<td>{0}</td>',
					'<td>{1:this.renderSex}</td>',
					'<td>{2:trim}</td>',//去掉字符串的首位空白
					'<td>{3:ellipsis(4)}</td>',//字符串超过指定长度会自动截取
				'</tr>'
			);
			//一定要放在t.compile()上面
			t.renderSex = function(value) {
		        if (value == 'male') {
		            return "<span style='color:red;'>红男</span>";
		        } else {
		            return "<span style='color:green;'>绿女</span>";
		        }
		    };
			//创建新模版后调用它来编译,现在可以通过这个生成我们需要的HTML的内容了
			t.compile();
			for(var i = 0;i<data.length;i++){
				/*
					第一个参数对应HTML中的一个表格,我们使用Ext提供的模版将JSON数据的每一行都转换为HTML,
					并添加到指定的table标签中,最终的显示结果包含5行数据的表格
				*/
				t.append(Ext.get('some-element'),data[i]);
			}
			
		});
    </script>
   </head>
   <body>
       <table border="1" id="some-element">
	       <tr>
	           <td>id</td>
	           <td>sex</td>
	           <td>name</td>
	           <td>descn</td>
	       </tr>
       </table>
    </body>
</html>
2.复杂模版Ext.XTemplate
XTemplate是对Template的增强,XTemplate不仅支持在模版内部使用子模板,
还具有for和if功能,可以让我们的模版实现循环和判断

XTemplate的内部
变量名	说明
values	当前范围内部的变量,每次使用使用时tpl都会进入一个子模板,只能使用子模板对应变量
parent	如果进入子模板,就需要通过parent引用上一级模版里的变量
xindex	循环索引值,从1开始
xcount	循环的总长度
fm		Ext.util.Format,想执行格式化操作,就直接引用它

2.1XTemplate输出后台传来的JSON对象
效果图

JSON对象

{student:[{id:'1',code:'1001',name:'',sex:'1',age:'23'}]}
代码
detailStore = new Ext.data.Store({
	url: 'list.jsp?flag=beforeUpdate',
	method : 'post',
	reader : new Ext.data.JsonReader({
		root: 'student',
       		fields: [
			{name : 'id'},
			{name : 'code'},
			{name : 'name'},
			{name : 'sex'},
			{name : 'age'}
		]
	})	
});   
var xtpl = new Ext.XTemplate(
    '<tpl for=".">',
    	'<table width="284" align="center" cellpadding="0" cellspacing="0" style="font-size:12px;" bgcolor="#C7D4E4">',
			'<tr height="30" align="center">',  
                   '<td style="border:1px solid #000000;">编号</td>',
                   '<td style="border:1px solid #000000;">&nbsp;{id}</td>',
               '</tr>',
               '<tr height="30" align="center">',  
                   '<td style="border:1px solid #000000;">学号</td>',
                   '<td style="border:1px solid #000000;">&nbsp;{code}</td>',
               '</tr>',
               '<tr height="30" align="center">',  
                   '<td style="border:1px solid #000000;">名字</td>',
                   '<td style="border:1px solid #000000;">&nbsp;{name}</td>',
               '</tr>',
               '<tr height="30" align="center">',  
                   '<td style="border:1px solid #000000;">性别</td>',
                   '<td style="border:1px solid #000000;">&nbsp;{sex}</td>',
               '</tr>',
               '<tr height="30" align="center">',  
                   '<td style="border:1px solid #000000;">年龄</td>',
                   '<td style="border:1px solid #000000;">&nbsp;{age}</td>',
               '</tr>',
		'</table>',
	'</tpl>'
  	);
//详细信息面板
var detailPanel =  new Ext.Panel({
	/*
		能够为自己设计模板和特定格式而提供的一种数据显示机制.
		DataView采用Ext.XTemplate为其模板处理的机制,
		并依靠Ext.data.Store来绑定数据,
		这样的话store中数据发生变化时便会自动更新前台.
	*/
	items : new Ext.DataView({
          store : detailStore,
          //构成这个DataView的HTML片断,或片断的数组
          tpl : xtpl,
       //True表示为允许同时可以选取多个对象项,false表示只能同时选择单个对象项或根本没有选区
       multiSelect: true,
       /*
       		此项是必须的设置
       		任何符号Ext.DomQuery格式的CSS选择符(如div.some-class or span:first-child)
       		以确定DataView所使用的节点是哪一种元素
       */
       itemSelector:'div.thumb-wrap',
       //没有数据显示时,向用户提示的信息
       emptyText: ''
      })
});
//详细信息窗体
detailWindow = new Ext.Window({
      		id : 'detailMessageWindow',
      		title : '学生信息详细',
	width:300,  
             height:184,
             closeAction:'hide',
             layout : 'fit',
	items : [detailPanel]
     	});

//详细信息
var detailRenderer = function(recordId){
	return '<input  type="button" value="...." onclick="detailMessage('+recordId+')"/>';
};
//打开详细信息窗口
function detailMessage(recordId){
	detailStore.load({
		params:{id : recordId}
	});
  	detailWindow.show();
};


2.1XTemplate输出一个下拉框

效果图

代码一:
<script type="text/javascript" defer>
	Ext.onReady(function (){
		var data = {
			//data中包含两部分内容:主体部分name和size,以及options数组
			name : 's',
			size : 5,
			options : [{
				text : '陕西省',
				value : '陕西'
			},{
				text : '西安市',
				value : '西安'
			},{
				text : '碑林区',
				value : '长安立交'
			}]
		};
		var xtpl = new Ext.XTemplate(
			'<select name = "{name}" size = "{5}">',
				/*
					使用tpl标签定义一个子模板,for="options"表示我们要对原始数据中的options属性进行循环操作,
					这样子模板会自动调用options的数据,循环输出为<option>标签
				*/
				'<tpl for="options">',
					'<option value="{value}">{text}</option>',
				'</tpl>',
			'</select>'
		);
		xtpl.append(Ext.getBody(),data);
	});
</script>
代码二:
<script type="text/javascript" defer>
	Ext.onReady(function (){
		var data = {
			name : 's',
			size : 5,
			options : ['陕西省','西安市','长安立交']
		};
		var xtpl = new Ext.XTemplate(
			'<select name = "{name}" size = "{5}">',
				'<tpl for="options">',
					//如果data.options中包含3个简单数组,子模板tpl可以使用{.}表示数组的每一项
					'<option value="{.}">{.}</option>',
				'</tpl>',
			'</select>'
		);
		xtpl.append(Ext.getBody(),data);
	});
</script>
2.2默认选奇数行
<script type="text/javascript" defer>
	Ext.onReady(function (){
		var data = {
			name : 's',
			size : 5,
			options : ['陕西省','西安市','长安立交']
		};
		var xtpl = new Ext.XTemplate(
			'<select name = "{name}" size = "{5}">',
				'<tpl for="options">',
					/*
						XTemplate()没有提供else功能,我们只好用if来判断
						这里使用xindex是for内置的一个变量,它表示循环项的索引值
						xindex是从1开始的
					*/
					'<tpl if="xindex%2==0">',
						'<option value="{.}">{.}</option>',
					'</tpl>',
					'<tpl if="xindex%2==1">',
						'<option value="{.}" selected>{.}</option>',
					'</tpl>',
				'</tpl>',
			'</select>'
		);
		xtpl.append(Ext.getBody(),data);
	});
</script>
2.3简化判断
<script type="text/javascript" defer>
	Ext.onReady(function (){
		var data = {
			name : 's',
			size : 5,
			options : ['陕西省','西安市','长安立交']
		};
		var xtpl = new Ext.XTemplate(
			'<select name = "{name}" size = "{5}">',
				'<tpl for="options">',
					//因为这个xidex不是外部提供的数据,所以要在{}上加上[],在XTemplate中调用内部变量都要这样用
					'<option value="{.}" {[xindex%2==1?"selected":""]}>{.}</option>',
				'</tpl>',
			'</select>'
		);
		xtpl.append(Ext.getBody(),data);
	});
</script>







<think>好的,用户现在问的是关于Ext JS 4.x中的列翻译问题。首先,我需要确定用户具体指的是什么。列翻译可能指的是在表格的列头显示不同的语言,或者在表格中显示的数据内容进行本地化处理。根据之前的对话历史,用户之前询问过如何打开窗口并加载选中行数据到表单,现在可能是在开发一个多语言支持的应用程序,需要在表格中实现国际化。 接下来,我需要回忆Ext JS 4.x的相关知识。Ext JS 4.x的本地化通常是通过重写组件的属性或使用资源文件来实现的。对于列头翻译,可能需要在定义列时直接设置中文的text属性,或者通过某种机制动态加载语言包。 用户可能需要具体的代码示例,比如如何在列定义中使用翻译后的文本。另外,可能还涉及如何管理多语言资源,比如使用JSON文件存储不同语言的键值对,然后在应用中动态加载这些资源。 考虑到用户之前的问题是关于数据加载和表单处理的,现在转向国际化,可能他们正在开发一个需要支持多语言的系统。因此,除了列头的翻译,可能还需要考虑日期格式、数字格式等其他本地化内容,但用户当前的问题集中在列翻译上。 我需要确保提供的解决方案兼容Ext JS 4.x的版本,因为不同版本的Ext JS在本地化处理上可能有所不同。例如,Ext JS 4.x可能需要手动处理本地化,而更高版本可能有更集化的解决方案。 然后,我应该分步骤说明如何实现列翻译。首先,直接设置列头的text属性为中文是最简单的方法。其次,如果需要动态切换语言,可能需要定义语言包,并在应用初始化时加载相应的语言文件。同时,覆盖Ext JS默认的英文文本,比如日期列中的格式提示。 还需要考虑数据内容的翻译,比如状态字段显示“已激活”或“已禁用”,可以通过renderer函数来实现。用户可能希望根据数据值动态显示对应的翻译文本,而不仅仅是静态的列头。 另外,可能提到使用Ext JS的本地化脚本,比如引入ext-lang-zh_CN.js文件,但这通常影响全局的本地化设置,如日期选择器的月份名称等,而不仅仅是表格列头。 最后,应该总结最佳实践,比如维护独立的语言资源文件,使用构建工具管理多语言版本,以及处理动态语言切换时的界面刷新问题。同时,指出Ext JS 4.x的本地化支持相对基础,可能需要开发者自行扩展,而在新版本中可能有更好的解决方案。 需要确保回答结构清晰,步骤明确,并提供代码示例,让用户能够直接应用。同时,提醒用户注意版本兼容性和可能遇到的常见问题,比如未正确加载语言文件导致的翻译缺失。</think>--- ### ExtJS 4.x 列翻译完整解决方案 #### 核心场景说明 在表格列头、单元格内容、分页工具栏等位置实现多语言显示,需处理以下三种翻译类型: 1. **列头标题**:静态文本翻译(如 "Username" → "用户名") 2. **数据内容**:动态值映射(如 status: 1 → "已激活") 3. **内置组件**:分页条等系统文案(如 "显示 1 - 20 / 100" → "Displaying 1 - 20 of 100") --- ### 一、基础列头翻译方案 #### 直接配置法(快速实现) ```javascript Ext.create('Ext.grid.Panel', { columns: [{ dataIndex: 'username', text: '用户名', // 直接写入目标语言 width: 120 }, { dataIndex: 'status', text: '状态', renderer: function(value) { return {1: '已激活', 0: '已禁用'}[value]; // 动态内容翻译 } }] }); ``` #### 语言包集中管理(推荐) 1. 创建语言资源文件 `locale/zh_CN.js` ```javascript Ext.define('MyApp.locale.zh_CN', { override: 'MyApp', // 覆盖应用级文本 columnTitles: { username: '用户名', status: '状态' }, statusMap: { 1: '已激活', 0: '已禁用' } }); ``` 2. 在表格中引用语言包 ```javascript Ext.require('MyApp.locale.zh_CN'); // 加载语言包 Ext.create('Ext.grid.Panel', { columns: [{ dataIndex: 'username', text: MyApp.locale.zh_CN.columnTitles.username }, { dataIndex: 'status', text: MyApp.locale.zh_CN.columnTitles.status, renderer: function(value) { return MyApp.locale.zh_CN.statusMap[value]; } }] }); ``` --- ### 二、高级动态翻译方案 #### 创建翻译工具类 ```javascript Ext.define('MyApp.util.Locale', { singleton: true, // 单例模式 currentLang: 'zh_CN', resources: { zh_CN: { 'Last Login': '最后登录时间', 'Page {0} of {1}': '第 {0} 页 / 共 {1} 页' }, en_US: { 'Last Login': 'Last Login', 'Page {0} of {1}': 'Page {0} of {1}' } }, translate: function(key) { var args = Ext.Array.slice(arguments, 1); var template = this.resources[this.currentLang][key] || key; return Ext.String.format.apply(Ext.String, [template].concat(args)); } }); ``` #### 在组件中使用 ```javascript // 列头翻译 columns: [{ text: MyApp.util.Locale.translate('Last Login'), dataIndex: 'lastLogin' }] // 分页条翻译 bbar: Ext.create('Ext.PagingToolbar', { store: store, displayMsg: MyApp.util.Locale.translate('Page {0} of {1}'), displayInfo: true }) ``` --- ### 三、特殊场景处理 #### 日期列本地化 ```javascript Ext.define('MyApp.locale.zh_CN', { override: 'Ext.grid.column.Date', format: 'Y-m-d H:i:s' // 覆盖默认日期格式 }); // 表格列配置 { xtype: 'datecolumn', text: '创建时间', dataIndex: 'createTime', format: MyApp.util.Locale.translate('Y-m-d H:i:s') // 动态格式 } ``` #### 枚举类型映射 ```javascript // 在 renderer 中实现多级翻译 renderer: function(value, meta, record) { return MyApp.util.Locale.translate( 'ORDER_STATUS_' + record.get('type') + '_' + value ); } ``` --- ### 四、完整工作流程示例 1. **初始化加载语言包** ```javascript Ext.onReady(function() { Ext.require('MyApp.locale.' + userLang); // 根据用户设置加载对应语言 MyApp.util.Locale.currentLang = userLang; }); ``` 2. **创建支持翻译的 Grid** ```javascript Ext.create('Ext.grid.Panel', { columns: [{ text: MyApp.util.Locale.translate('Username'), dataIndex: 'username', renderer: function(value) { return MyApp.util.Locale.translate('USER_' + value.toUpperCase()); } }], bbar: { xtype: 'pagingtoolbar', displayMsg: MyApp.util.Locale.translate('Page {0} - {1} of {2}') } }); ``` --- ### 最佳实践建议 1. **分离语言文件** ``` /locale /zh_CN Grids.js Forms.js Messages.js /en_US Grids.js Forms.js ``` 2. **构建时打包** ```bash sencha app build --locale=zh_CN ``` 3. **动态切换语言** ```javascript changeLanguage: function(lang) { Ext.Ajax.request({ url: 'locale/' + lang + '.js', success: function() { window.location.reload(); // 需重新加载页面 } }); } ``` --- ### 常见问题解决 **Q1 翻译未生效** ```javascript // 检查加载顺序,确保语言包在组件初始化前加载 Ext.require('MyApp.locale.zh_CN', { before: 'MyApp.view.MainGrid' // 强制前置加载 }); ``` **Q2 覆盖 ExtJS 原生组件** ```javascript // 覆盖默认分页条文字 Ext.override(Ext.PagingToolbar, { displayMsg: "显示第 {0} - {1} 条,共 {2} 条" }); ``` **Q3 处理复数形式** ```javascript translatePlural: function(key, count) { var suffix = (count > 1) ? '_PLURAL' : '_SINGULAR'; return this.translate(key + suffix, count); } ``` 该方案可完整实现 ExtJS 4.x 的列翻译需求,建议结合 Sencha CMD 的本地化打包功能实现多语言版本构建。对于更复杂的项目,推荐使用第三方 i18n 库(如 i18next)进行深度集成。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值