[Ext JS6]多类型设备开发

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/oscar999/article/details/85256279


ExtJS 6可以很容易做到在多种设备运行的前端应用。

通用的应用程序和工具包

Ext JS6将 Ext JS 和 Touch合并到包含不同工具包的同一个框架中。 classic 和 modern 。这些工具包包含 ExtJS 和 Touch 的视图层。共享核心资源和逻辑功能的应用就成为通用的应用程序。
选择应用程序的工具包, 只需要修改由 Cmd 产生的应用程序的 app.json 文件的如下内容:
“toolkit”: “classic”,
两个框架的核心部分, 像data、controllers、models等被调整到一个共同的平台,这样就可以共享数据和逻辑。

app.json是由cmd产生的,包含了一些可以调整的属性。
如果是就项目的升级, 旧的app.json可能有点属性没有, 升级之后,在.sencha/app/app.defaults.json文件就可以看到默认值的配置了, 复制到对对应的app.json。

Classic - 经典
Classic工具 包支持传统的 Ext JS 5 的应用程序, 包括桌面浏览器、平板和触摸屏的笔记本电脑。

Modern - 现代
Modern工具包支持 HTML5应用程序, 包括桌面和手机的所有现代浏览器 (IE11及以上)都支持。

构建配置

对app.json文件的builds属性的不同配置可以创建不同类型的应用程序。习惯上,构建不同主题和本地化的应用。
通过设置classic?或者modern?(也可以是同时设置), Cmd 会找到每一个配置来进行构建。
在每个工具包中, 业务逻辑是共用的。
看一个实例:

"builds": {
   "mymodern": {
       "toolkit" : "modern",
       "theme"   : "theme-cupertino",
       "requires": [
           "charts",
           "ux"
       ]
   },
   "myclassic": {
      "toolkit" : "classic",
      "theme"   : "theme-neptune",
         "slicer"  : null,
      "requires": [
           "charts"
       ]
   }
}

Cmd 构建

以上面为例,

  1. 构建现代的应用程序
sencha app build mymodern
  1. 构建经典的应用程序
sencha app build myclassic
  1. 构建所有的
sencha app build

注意:构建的名字是可以随便给的, 文件和命令对应上就可以了。

以上mymodern
的构建使用 modern 工具包,使用ux和 chart 的包,主题是:cupertino 。

可以创建任意的构建, 默认,输出的目录在根目录的构建目录。

通用应用程序

通用应用程序使用 Cmd 产生跨两个工具包的多个应用程序。 应用程序的构建结果可以运行在桌面端或是移动设备。需要注意的是同一个个应用程序不能在同一个类路径包含 modern和 classic两个框架。一般状况, 应用程序会在一个传统的应用程目录包含全局逻辑, 也就是目录:app。理想状况下, 应用程序的通用部分包括数据、模型、视图模型等, 共享控制器。逻辑部分跨工具包需要好好考虑一下。
举例来说, 一个经典的应用程序有一个grid, 一个现代的应用程序有一个list, 两个组件共享store和model。如果需要这两个组件针对用户的操作做出反应, 就需要在这个grid和list找到相同的事件。因为两个组件都可以触发select事件,理想的方案可能是利用它。但是,如果逻辑有包含itemtap, 而这个在经典模式是不认识的, 这样在Cmd构建经典的时候就可能会有问题。
考虑共用逻辑和资源之后, 在不同的工具包的 src目录下创建不同工具包特定的代码。

注意: 如果是构建单个工具包的应用,则目录结构看起来和之前的很类似。
Ext JS6目录结构,包括三个部分:

  • 全局应用代码
  • 经典特定代码
  • 现代特定代码
    类似:
// app
     // app
          // model
          // store    
          // view
     // classic
          // src
          // sass
          // resources
     // modern
          // src
          // sass
          // resources
     // resources
     // sass

创建通用的应用

使用 cmd 命令:

sencha -sdk /path/to/ExtSDK generate app MyApp ./MyAppLocation

这个命令会创建一个功能齐全的通用应用, 会产生classic?和modern?的应用, 共用的部分在 app目录下。工具包特定的定义在各自的目录中(modern 、classic) 。

在开发的时候, 可以针对不同的工具包进行启动:
现代:

sencha app watch modern

经典:

sencha app watch classic 

如果不输入查看的目标的话, 默认使用builds?配置里的第一个。
对应用构建之后, 就可以在各自的浏览器进行查看。在手机查看modern?风格的, 在桌面查看classic版本的。

运行时配置

除此,还可以通过运行是配置, 包括应用配置、响应配置和平台配置 来使用户对于不同的媒介有着相同的无缝的体验。

App Profiles - 应用配置

Ext.app.Profile可以基于mainView(或者 Viewport)切换应用的视图。也就是说, 可以通过在某些条件下激活一个profile?创建一整套不同的视图。举例来说, 根据应用在不同的设备上(移动或者桌面浏览器)指定特定的视图。
创建两个应用配置的例子:


Ext.define('App.Application', {
    extend: 'Ext.app.Application',

    profiles: [
        'Desktop',
        'Mobile'
    ]
});

通过Profile的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会被执行。

Platform Configs - 平台配置

platformConfig?属性使用在类的定义中, 用于基于平台或设备的类型的配置, 类似:

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看成是类定义的一部分, 如果将视图看成数据的话, 第二种方式是标准的 JSON格式。
也可以如下方式使用:

Ext.define('App.view.summary.Manufacturing', {
    extend: 'Ext.panel.Panel',

    items: [{
        xtype: 'panel',

        platformConfig: {
            desktop: {
                title: 'Manufacturing Summary'
            },
            '!desktop': {
                title: 'Mfg Summary'
            }
        }
    }]
});

platformConfig的配置由initConfig?方法进行合并处理,也就是说, 只有在构造函数调用initConfig方法的类platformConfig才能生效。这些类包括:Ext.Widget,?Ext.Component, 大部分的数据类AbstractStore, 和使用Observable的类。

响应配置 - Responsive Configs

Ext JS 5开始引入responsiveConfig?,Responsive Mixin?和插件启用它。responsiveConfig配置的规则和属性不仅仅是在创建实例的时候, 而且会根据设备的方向和大小的变化来适应。相比platformConfig, responsiveConfig?的花销会大一些。
以下,根据设备的宽来显示标题:

 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'
        }
    }
});

以上是应用在类上面, 如果是应用在实例上,就需要使用插件plugins了, 类似:

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'
            }
        }
    }]
});

需要注意的是上面的是 viewport?的宽度,不是组件的宽度。

结论

不同的工具应用在不同的场景, 在加载时使用platformConfig,动态条件, 用responsiveConfig, 在更大的范围修改, 用Ext.app.Profile。
如果需要应用在平板和在桌面和手机看上去完全不一样, 可以考虑使用 cmd 的构建配置(profiles)。

猜你喜欢

转载自blog.csdn.net/oscar999/article/details/85256279