本文共 5300 字,大约阅读时间需要 17 分钟。
原文:
鉴于当今设备和表单因素的扩散,要针对所有这些可能性来优化应用程序已经变得越来越复杂。虽然可以使 用CSS响应这些环境条件,但典型的,如Ext JS应用程序这样,还是要包含大量的Javascript。在某些情况下,使用javascript来针对设备细节进行编码可能很简单,但也可能很快就会 失控。好消息是,在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类似。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.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方法会被调用。
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 GriffinDon 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.
转载地址:http://uaeja.baihongyu.com/