【翻译】针对多种设备定制Ext JS 5应用程序
原文:Tailoring Your Ext JS 5 Application for a Multi-Device World
概述
鉴于当今设备和表单因素的扩散,要针对所有这些可能性来优化应用程序已经变得越来越复杂。虽然可以使用CSS响应这些环境条件,但典型的,如Ext JS应用程序这样,还是要包含大量的Javascript。在某些情况下,使用javascript来针对设备细节进行编码可能很简单,但也可能很快就会失控。好消息是,在Ext JS 5.1,提供了几个功能强大的工具来管理这种复杂性。
在先前的文章已经介绍了许多这样的技术。这有助于去了解与比较他们之间的异同,以便于选择适合的工具来完成手头的工作。
内联技术
要理解这些工具的最好方式就是通过一个简单的示例。下面假设需要针对不同的设置对面板定义不同的标题。对于某些设备的面板,在有足够的空间,因而更长的、描述性的标题更适合,而毒药小屏幕,则缩写的标题更适合。本练习的目的不在于讲解如何使用最好的方式来完成这个特定的目标,而是要确保所采取的技术不会被更复杂的示例的细节所掩盖。
platformConfig
属性platformConfig是在Ext JS 5.1中新添加的,可以在类定义中使用,或者可以基于当前平台或设备分类在创建类的实例时的配置对象中使用。在视图中使用时可能类似以下代码:
Ext.define('App.view.summary.Manufacturing', {
extend: 'Ext.panel.Panel',
title: 'Mfg Summary',
platformConfig: {
desktop: {
title: 'Manufacturing Summary'
}
}
});
以上代码和下面的直接方法具有相同的效果:
Ext.define('App.view.summary.Manufacturing', {
extend: 'Ext.panel.Panel',
title: testForDesktop ? 'Manufacturing Summary'
: 'Mfg Summary'
});
以上代码不是让你去比较platformConfig和三样运算符的优缺点,而是让你去了解platformConfig是如何被声明为了类的一部分的。因此,该方法的工作是与基类无关的。使用platformConfig而不使用内联逻辑的一个原因是这样可以保证视图作为一个纯数据可以被安全被定义为JOSN格式。
还可以使用platformConfig来配置实例:
Ext.define('App.view.summary.Manufacturing', {
extend: 'Ext.panel.Panel',
items: [{
xtype: 'panel',
platformConfig: {
desktop: {
title: 'Manufacturing Summary'
},
'!desktop': {
title: 'Mfg Summary'
}
}
}]
});
也可以将上面代码直接转换为:
Ext.define('App.view.summary.Manufacturing', {
extend: 'Ext.panel.Panel',
items: [
Ext.merge({
xtype: 'panel'
},
testForDesktop ? {
title: 'Manufacturing Summary'
} : {
title: 'Mfg Summary'
})
]
});
然而,在这里使用platformConfig,是合并在initConfig方法中进行处理的,也就是说,将platformConfig属性作为实例配置只有在类的构造函数中调用了initConfig方法时才能实现。而这也是Ext.Widget、Ext.Component、大部分数据包类(如store)和其他类使用Ext.mixin.Observable的原因。
在实例配置中通过修改对象的初始配置来使用platformConfig与在类声明中修改类主体来使用platformConfig类似。
responsiveConfig
Ext JS 5引入了responsiveConfig并通过混入或插件来启用它。responsiveConfig的不同之处在于它的规则和属性不只在创建实例时进行计算,还会在设备的方向或可视区域发生改变时进行计算。这相对于platformConfig来说会增加一些开销,通过监听窗口大小或方向的改变来处理可能来得更有效。
可以稍微调整一下要求,以便根据设备的大小来进行标题响应,而不是设备分类(“desktop”)。
Ext.define('App.view.summary.Manufacturing', {
extend: 'Ext.panel.Panel',
mixins: ['Ext.mixin.Responsive'],
responsiveConfig: {
'width >= 600': {
title: 'Manufacturing Summary'
},
'width < 600': {
title: 'Mfg Summary'
}
}
});
由于以上类使用了responsiveConfig,因而在这里使用了混入,这比使用插件的方式更有好处,因为这样可以避免为每要给实例创建一个插件。不过,在组件实例上使用的时候,就需要使用responsive 插件:
Ext.define('App.view.summary.Manufacturing', {
extend: 'Ext.panel.Panel',
items: [{
xtype: 'panel',
plugins: 'responsive',
responsiveConfig: {
'width >= 600': {
title: 'Manufacturing Summary'
},
'width < 600': {
title: 'Mfg Summary'
}
}
}]
});
以上代码要谨记的是宽度指的是可视区域的宽度,而不是组件宽度。
Ext.app.Profile
使用platformConfig和responsiveConfig,可以说是外科手术式的调整。而使用配置文件,则可以管理更大的差异。配置文件被添加到Ext JS 5.1中,且作为应用程序架构的一部分,它最初是在Sencha Touch中引入的。
通常,使用配置文件可在应用程序的顶层通过mainView(或Viewport)进行切换,这意味着可以通过当前的配置文件来控制应用程序创建完全不同的视图。
配置文件只可用于使用Ext.app.Application的应用程序,且必须如以下代码哪样列出不同的配置文件:
Ext.define('App.Application', {
extend: 'Ext.app.Application',
profiles: [
'Desktop',
'Mobile'
]
});
在每一个配置文件类内,isActive方法决定了该特定的配置文件应否为当前活动的配置文件:
Ext.define('App.profile.Desktop', {
extend: 'Ext.app.Profile',
mainView: 'App.view.desktop.Main',
isActive: function () {
return Ext.os.is.Desktop;
},
launch: function () {
console.log('Launch Desktop');
}
});
可以在平板或桌面中尝试一下这个示例来看看配置文件的基本使用方式。也可以在这里查看示例的源代码。
配置文件不需要使用mainView配置项,并可以选择使用提供的launch方法来进行自定义处理。只有当前活动的配置文件的launch方法会被调用。
Sencha Cmd的生成配置
如果使用Sencha Cmd来创建应用程序,也可以使用它来创建配置文件,这功能是在Sencha Cmd 5.0中引入的。创建配置文件可以让你只需要单独一个HTML页面(应用程序)并在加载时选择多个生成版本。这类似于如何去选择一个 Ext.app.Profile实例,而实际上是加载不同的生成版本。这种选择的基础可能是环境、存储的Cookie,甚至可能是用户账号中存放在服务器的数据。
无论是如何进行检测的,只有被选择的生成的代码和CSS会被加载。这与Ext.app.Profile需要在生成中包含所有配置文件的代码不同。
Ext JS Kitchen Sink示例就是使用多生成配置文件来启用主题与区域切换的。它根据每一个生成配置创建了两个生成选择,并在URL中通过查询参数来选择所需的生成配置文件,这时候,在index.html中的代码类似如下代码:
var Ext = Ext || {};
Ext.beforeLoad = function(tags){
var theme = location.href.match(/theme=([\w-]+)/),
locale = location.href.match(/locale=([\w-]+)/);
theme = (theme && theme[1]) ||
(tags.desktop ? 'crisp' : 'crisp-touch');
locale = (locale && locale[1]) || 'en';
Ext.manifest = theme + "-" + locale;
};
小结
有了许多工具在手,针对特定情况选择合适的工具是个问题。对于只是在加载时进行简单调整的情况,可以考虑platformConfig。对于更多动态条件的情况,建议responsiveConfig。如果是更大规模的情况,可以考虑Ext.app.Profile。
如果需要在平板电脑而不是桌面上(甚至于基于用户授权),让应用程序看起来完全不同,可以考虑Sencha Cmd生成配置,它可以从桌面生成中移除平板开销,反过来也一样。
由于没有放之四海而皆准的解决方案,Ext JS提供了不同的工具来增加灵活性和效率。他们一起工作有助于确保应用程序自然而然的适合广泛的各种设备。
作者:Don Griffin
Don Griffin is the Engineering Manger for Ext JS and Sencha Touch. He was an Ext JS user for 2 years before joining Sencha and has over 20 years of software engineering experience on a broad range of platforms. His experience includes designing web application front-ends and back-ends, native GUI applications, network protocols and device drivers. Don’s passion is to build world class products that people love to use.
【翻译】针对多种设备定制Ext JS 5应用程序的更多相关文章
- 将Ext JS 5应用程序导入Web项目以及实现本地化
在Ext JS 5,使用了新的脚本和样式加载方式,这对于将应用程序导入到Web项目中产生了点小麻烦.而对于本地化文件的导入,也采用了新的方式,本文将一一解答这些问题. 将Ext JS 5应用程序导入W ...
- 【翻译】在Ext JS 5应用程序中怎样使用路由
原文:How to Use Routing in Your Ext JS 5 Apps 简单介绍 Ext JS 5是一个重要的公布版本号,它提供了很多新特性来创建丰富的.企业级的Web应用程序.MVV ...
- 【翻译】在Ext JS 5应用程序中如何使用路由
原文:How to Use Routing in Your Ext JS 5 Apps 简介 Ext JS 5是一个重要的发布版本,它提供了许多新特性来创建丰富的.企业级的Web应用程序.MVVM和双 ...
- 在Ext JS 5应用程序中如何使用路由
简介 Ext JS 5是一个重要的发布版本,它提供了许多新特性来创建丰富的.企业级的Web应用程序.MVVM和双向数据绑定为开发人员承担了大量的繁重工作.在Ext JS 5种,另一个新特性就是路由,它 ...
- Ext JS 6应用程序Build后出现“c is not a constructor return new c(a[0])”的处理
概述 在对Ext JS 6的应用程序打包后,时不时会出现以下错误: 由于是压缩后出现的错误,要进行调试也无从下手,因而这个错误会令新手手足无措,不知道是怎么回事. 错误原因 造成该错误的主要原因是要创 ...
- 将Ext JS 6应用程序导入Web项目
由于Ext JS 6包含了Sencha Touch,因而在应用程序结构有了些改变,Ext JS 5的方法已经不适用于新版本了.经过研究,发现6导入Web项目要比5简单. 下面来说说导入的过程. 使用S ...
- 将Ext JS 5应用程序导入Web项目中
相关资料:http://docs.sencha.com/extjs/5.1/getting_started/welcome_to_extjs.html 原文地址: https://blog.csdn. ...
- 【翻译】使用Sencha Ext JS 6打造通用应用程序
原文:Using Sencha Ext JS 6 to Build Universal Apps {.aligncenter} 在Sencha和整个Ext JS团队的支持下,我很高兴能跟大家分享一下有 ...
- 【翻译】Sencha Ext JS 5公布
原文:Announcing Sencha Ext JS 5 简单介绍 我代表Sencha和整个Ext JS团队,非常自豪的宣布,在今天,Sencha Ext JS 5公布了.Ext JS 5已经迈出了 ...
随机推荐
- Vue结合slot插槽分发父组件内容实现高度复用、更加灵活的dialog组件
之前写过一篇关于vue实现dialog会话框组件的文章(http://www.cnblogs.com/fozero/p/8546883.html)[http://www.cnblogs.com/foz ...
- MySQL 字符串截取SUBSTRING()函数
MySQL 字符串截取相关函数: 1.从左开始截取字符串 left(str, length) 说明:left(被截取字段,截取长度) 例: select left(content,200) as ab ...
- windows系统和centos双系统安装引导项修改
在CentOS下修改Linux引导文件: (1)找到win10的引导 1.首先我们点击第一个系统进入centos 2.运行终端,敲入命令su,为了获取管理员权限,然后终端提 ...
- Android Studio精彩案例(六)《使用一个Demo涵盖补间动画所有知识》
转载本专栏文章,请注明出处,尊重原创 .文章博客地址:道龙的博客 元旦假期里,闲的无事,看到美团加载数据的动画,就突想写个Demo把动画知识集成一下.后来想了想,还是直接用一个Demo来把所有动画知识 ...
- cassandra 3.x官方文档(5)---探测器
写在前面 cassandra3.x官方文档的非官方翻译.翻译内容水平全依赖本人英文水平和对cassandra的理解.所以强烈建议阅读英文版cassandra 3.x 官方文档.此文档一半是翻译,一半是 ...
- 数组中的数分为两组,让给出一个算法,使得两个组的和的差的绝对值最小,数组中的数的取值范围是0<x<100,元素个数也是大于0, 小于100 。
比如a[]={2,4,5,6,7},得出的两组数{2,4,6}和{5,7},abs(sum(a1)-sum(a2))=0: 比如{2,5,6,10},abs(sum(2,10)-sum(5,6))=1 ...
- 十六进制字符串转化为十进制值strtoul函数
eg: NSString *strtest =@"7fffffff"; NSUInteger val = strtoul([[strtest substringWithRange: ...
- Android实现多条Toast快速显示(强制中止上一条Toast的显示)
Android实现多条Toast快速显示 Toast多用于我们开发人员调试使用,有时候也作为给用户的弱提示使用,我们常用的方法是 Toast.makeText(this, "弹出Toast& ...
- 关于在页面中针对不同版本的IE浏览器实现不同的JS或者CSS样式
一般会用到<!--[if IE]>这里是正常的html代码<![endif]--> 条件注释只能在windows Internet Explorer(以下简称IE)下使用,因此 ...
- Linux telnet远程登录操作
telnet (如果不行 可以却换root帐户试试 su - root) 1.安装telnet-server sudo dpkg -i xinetd_1%3a2.3.14-7ubuntu3_ ...