【翻译】针对多种设备定制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已经迈出了 ...
随机推荐
- ubuntu 14.04 64位 安装Opencv3.1.0 (包含opencv_contrib模块)
写在前边: 据官方说法,目前还不是太稳定的算法模块都在opencv_contrib里边,由于不稳定,所以不能在release版本里发行,只有在稳定以后才会放进release里边.但是这里边有很多我们经 ...
- 工作流程,编程,调试,性能:Unity游戏开发者应该学习的20个改进技巧
Unity 是一个备受欢迎的游戏开发平台.它的功能令人印象深刻,同时也迎合了不同的游戏开发需求.游戏开发者可以使用 Unity 创建任何类型的游戏,从世界级的 RPG 游戏到最流行的增强现实游戏 Po ...
- Web缓存(一) - HTTP协议缓存
为什么要使用 Web 缓存 Web缓存一般分为浏览器缓存.代理服务器缓存以及网关缓存,本文主要讲的是 浏览器缓存,其它两种缓存大家自行去了解下. Web 缓存游走于服务器和客户端之间.这个服务器可能是 ...
- JAVA 中转义符的理解
生物信息中有时候会遇到JAVA写的程序,今天阅读源码的时候发现对于正则中的转义符不好理解,后来查资料后终于弄明白了,这里详细说明一下: 字符串的表示有三种方法:1.直接单字符,例如"A&qu ...
- Node.js 进程
process 是全局对象,能够在任意位置访问,是 EventEmitter 的实例. 退出状态码 当没有新的异步的操作等待处理时,Node 正常情况下退出时会返回状态码 0 .下面的状态码表示其他状 ...
- Docker部署Zabbix+Grafana监控
Docker部署Zabbix+Grafana监控 环境 centos 7 ; Docker 17.12.0-ce ; docker-compose version 1.20.1 2018-4-1 当前 ...
- C/C++ 函数指针
函数声明 例如: float func(int, int); 以上就是一个函数的声明,要注意它的实际功能并没有被实现,换句话说就是它并没有被定义,只是声明此函数的存在.要想调用次函数,你必须对对此函数 ...
- python复杂网络库networkx:绘图draw
http://blog.csdn.net/pipisorry/article/details/54291831 networkx使用matplotlib绘制函数 draw(G[, pos, ax, h ...
- 使用Spring Boot开发Web项目
前面两篇博客中我们简单介绍了Spring Boot项目的创建.并且也带小伙伴们来DIY了一个Spring Boot自动配置功能,那么这些东西说到底最终还是要回归到Web上才能体现出它的更大的价值,so ...
- linux:cpu 每-CPU 的变量
每-CPU 的变量 每-CPU 变量是一个有趣的 2.6 内核的特性. 当你创建一个每-CPU变量, 系统中每个处理器获得它自己的这个变量拷贝. 这个可能象一个想做的奇怪的事情, 但是它有自己的优点. ...