Sencha Touch 历史支持

简介: 路由、深链接以及后退按钮 Routing, Deep Linking and the Back ButtonSencha Touch 2 提供完整的历史与深链接的支持,使得我们的 Web 应用拥有以下两点大的好处:浏览器的“后退”按钮在你的应用中有效了,也就是说,虽然按下了后退键,但浏览器并不会立刻刷新,而是仍停留在当前的页面中。

路由、深链接以及后退按钮 Routing, Deep Linking and the Back Button

Sencha Touch 2 提供完整的历史与深链接的支持,使得我们的 Web 应用拥有以下两点大的好处:

  • 浏览器的“后退”按钮在你的应用中有效了,也就是说,虽然按下了后退键,但浏览器并不会立刻刷新,而是仍停留在当前的页面中。
  • 可以使用“深链接”了,也就是说,可以分配的一个 url,直达制定的页面(在同一个页面中)。

上述功能综述之,就是为了更好地与原生程序相贴近,务求达到无差别的用户体验——这一点,尤其体现在能够提供“返回键”的 Android 机器上面。

设置路由器 Setting up routes

为你的应用安排的历史记录可以说一点都不困难,主要集中在如何理解的路由器(routes)的概念之上。路由器,简言之,用于定义某一 url 与用户控制器动作之间的映射关系——所谓映射关系,只要在浏览器的地址栏中输入一个地址,对应的控制器便会自动执行某组逻辑动作。咱们看看一个简单的控制器:

    Ext.define('MyApp.controller.Products', {
        extend: 'Ext.app.Controller',

        config: {
            routes: {
                'products/:id': 'showProduct'
            }
        },

        showProduct: function(id) {
            console.log('showing product ' + id);
        }
    });

通过指定 {@link Ext.app.Controller#routes routes},当诸如“#products/123” 这样的 url 输入到浏览器时就会通知 Main 控制器。详细点说,就是你的域名是 http://myapp.cpm,然后任何的 http://myapp.com/#products/123、 http://myapp.com/#products/456 或 http://myapp.com/#products/abc 这般的链接,其实终归自动进入到 showProduct 函数的执行环境中去。

当 showProduct 被执行时,其参数就是那个 url 解析而致的。有否注意到路由器中的“:id”部分,因为我们约定,有冒号“:”即表示后面跟的是为一个参数,路由器内部解析好 url 就会得到这个参数然后送入到你所写的函数中去。值得注意的是,该参数总是字符类型(无需多言,url 本身亦是字符类型),于是浏览器得到的“http://myapp.com/#products/456 or http://myapp.com/#products/abc”亦即等于调用 showProduct('456')。

路由器合法的格式多种多样,构成了不同参数的映射关系,例如:

    Ext.define('MyApp.controller.Products', {
        extend: 'Ext.app.Controller',

        config: {
            routes: {
                'products/:id': 'showProduct',
                'products/:id/:format': 'showProductInFormat'
            }
        },

        showProduct: function(id) {
            console.log('showing product ' + id);
        },

        showProductInFormat: function(id, format) {
            console.log('showing product ' + id + ' in ' + format + ' format');
        }
    });

第一个路由很简单,前面已经说了说;第二个路由接纳 #products/123/pdf 这样的输入,转到 showProductInFormat 函数,便在在控制台中记录了 showing product 123 in pdf format 这样的输出。另外,id、format 也是按照路由定义中的顺序送入函数中。

当然了,实际中你写的并不像我们这里教学例子的那么简单。大家想该怎么做了吗?就是在控制器中写你的业务逻辑,获取数据啊、更新UI啊的任务……

高级路由器 Advanced Routes

路由器支持通贝符(wildcards)。默认下,通贝符表示不分字符或数字。假设“products/:id/edit”可以接纳“#products/123/edit”但不接纳“#products/a ,fd.sd/edit”,因为后者包含的空格、逗号、句号均不在通贝符涵盖的类型之列。

不过有时我们想自定义复杂一些的规制,——这没问题,我们分配一个配置项对象给 routes 对象而不是字符串,好比如下:

    Ext.define('MyApp.controller.Products', {
        extend: 'Ext.app.Controller',

        config: {
            routes: {
                'file/:filename': {
                    action: 'showFile',
                    conditions: {
                        ':filename': "[0-9a-zA-Z\.]+"
                    }
                }
            }
        },

        //opens a new window to show the file
        showFile: function(filename) {
            window.open(filename);
        }
    });

当然不直接分配方法名称的名称还需要说明你要调用哪个函数,就写在配置项对象的 action 属性中。此外关键的是,条件配置项 {@link Ext.app.Route#conditions conditions} 其 key 为对应的 token,然后 value 为期望的规制。结果,假设一 url 系  http://myapp.com/#file/someFile.jpg,路由器解析后执行 showFile 函数,并送入“someFile.jpg”的参数。

复原状态 Restoring State

前面为大家介绍了定义路由器映射规制的相关知识后,接下来,就是详细讲讲具体的应用了。因为既然是“单页面的应用程序”的缘故,所以我们不轻易地产生一个 url 对应一张页面——如果我们进入首页后,一步步查找分类然后再找到那笔记录,——岂不是很累?所以说,由框架设定一套 url 规制便很有必要了。我们看看下面一个简单的例子,比如还是进入 http://myapp.com/#products/123,我们修改一下 Product 控制器如下:

    Ext.define('MyApp.controller.Products', {
        extend: 'Ext.app.Controller',

        config: {
            refs: {
                main: '#mainView'
            },

            routes: {
                'products/:id': 'showProduct'
            }
        },

        /**
         * products/:id 路由器的终点。获取一个货物的详细信息然后 push 的新视图。Endpoint for 'products/:id' routes. Adds a product details view (xtype = productview)
         * into the main view of the app then loads the Product into the view
         *
         */
        showProduct: function(id) {
            var view = this.getMain().add({
                xtype: 'productview'
            });

            MyApp.model.Product.load(id, {
                success: function(product) {
                    view.setRecord(product);
                },
                failure: function() {
                    Ext.Msg.alert('Could not load Product ' + id);
                }
            });
        }
    });

这里的 products/:id 终点就会立刻添加一新视图到主视图中(如非导航类可以是其他的 TabPanel 控件),进而由 model 类(MyApp.model.Product)向服务器获取货物的详细信息。这一过程是异步的过程,所以我们分配了两个回调函数,分别对应成功(渲染 货物 UI)与失败的情形。

不同的应用有不同的复原状体逻辑,一些深入链接的情形。官方例子 Kitchen Sink 就是一个很好的例子,尤其它采用了  NestedList 方式的导航很能说明问题,并且有手机和平板的两种适应场景。具体怎么办到的?请到 Kitchen Sink 例子 app/controller/phone/Main.js and app/controller/tablet/Main.js 的 showView() 源码看看吧。

Sharing urls across Device Profiles

无论你有多少套<a href="#!/guide/profiles">设备描述 Device Profiles</a>,但一般来说你都会只使用路由结构,也就是说,你在 iPhone 上看到一页面,发觉不错,然后想共享该 url 给别人的话,那么直接把 url 复制给别人即可,无须担心人家的是否手机抑或平板。因此,建议分别在手机子类上写一套路由的配置,然后在平板子类上写一套路由的配置:

    Ext.define('MyApp.controller.Products', {
        extend: 'Ext.app.Controller',
        config: {
            routes: {
                'products/:id': 'showProduct'
            }
        }
    });

手机版的显示方式有所不同,于是,我们写出 showProduct 函数的手机版实现:

    Ext.define('MyApp.controller.phone.Products', {
        extend: 'MyApp.controller.Products',

        showProduct: function(id) {
            console.log('showing a phone-specific Product page for ' + id);
        }
    });
平板电脑的话,在其子类中写出特定的实现:

    Ext.define('MyApp.controller.tablet.Products', {
        extend: 'MyApp.controller.Products',

        showProduct: function(id) {
            console.log('showing a tablet-specific Product page for ' + id);
        }
    });
目录
相关文章
|
人工智能 自然语言处理 程序员
提交通义灵码创新实践文章,重磅好礼只等你来!
通义灵码创新实践征集赛正式开启,发布征文有机会获得重磅好礼+流量福利,快来参加吧!
18241 21
|
存储 NoSQL Java
【面试宝藏】Redis 常见面试题解析
Redis 是内存数据结构存储系统,用作数据库、缓存和消息中间件,支持字符串、哈希、列表等数据类型。它的优点包括高性能、原子操作、持久化和复制。相比 Memcached,Redis 提供数据持久化、丰富数据结构和发布/订阅功能。Redis 采用单线程模型,但通过 I/O 多路复用处理高并发。常见的面试问题涉及持久化机制、过期键删除、回收策略、集群和客户端等。
359 4
|
存储 弹性计算 前端开发
用于搭建企业官网,如何选择阿里云服务器配置?
搭建企业官网时,可选阿里云ECS计算型c7实例,基于Intel Xeon Ice Lake处理器,提供2-128核与4GB-256GB内存选项,支持ESSD云盘。对于低访问量官网,推荐更具性价比的ECS通用算力型u1实例,配置为2核4GB内存,5M固定带宽,80G ESSD Entry盘,首年及续费均为199元。高性能需求可选用c7实例,适用于视频处理、大型游戏前端等场景。
664 12
|
SQL 存储 数据管理
掌握SQL Server Integration Services (SSIS)精髓:从零开始构建自动化数据提取、转换与加载(ETL)流程,实现高效数据迁移与集成——轻松上手SSIS打造企业级数据管理利器
【8月更文挑战第31天】SQL Server Integration Services (SSIS) 是 Microsoft 提供的企业级数据集成平台,用于高效完成数据提取、转换和加载(ETL)任务。本文通过简单示例介绍 SSIS 的基本使用方法,包括创建数据包、配置数据源与目标以及自动化执行流程。首先确保安装了 SQL Server Data Tools (SSDT),然后在 Visual Studio 中创建新的 SSIS 项目,通过添加控制流和数据流组件,实现从 CSV 文件到 SQL Server 数据库的数据迁移。
4151 0
|
定位技术
在获取的静态住宅IP代理时需要注意哪些?
获取高质量静态住宅IP代理需注意三点:1) 确保IP为住宅环境,通过位置和ISP验证;2) 重视代理的稳定性和安全性,以保障服务连续性;3) 遵守法律,合法使用IP资源。
238 0
在获取的静态住宅IP代理时需要注意哪些?
|
Java
继承与隐藏:Java中父类成员变量的神秘禁忌
继承与隐藏:Java中父类成员变量的神秘禁忌
377 0
|
存储 容器
华为机试HJ41:称砝码(深度优先遍历dfs-Depth First Search)
华为机试HJ41:称砝码(深度优先遍历dfs-Depth First Search)
288 0
|
机器学习/深度学习 数据挖掘 PyTorch
多标签分类场景下的模型评估指标
指标在机器学习或深度学习领域扮演着相当重要的角色。我们从根据问题选择指标开始,以了解特定模型的基线分数。 在本博客中,我们研究了多标签分类的最佳和最常用的指标,以及它们的不同之处。 接下来,让我们深入了解什么是多标签分类,以防万一您需要它。 如果我们有关于狗的特征的数据,我们可以预测它属于哪个品种和宠物类别。 在物体检测的情况下,多标签分类为我们提供了图像中所有对象的列表,如下图所示。我们可以看到,分类器检测到图像中的 3 个对象。 如果训练对象的总数为 4 个,则可以将其表示成如下列表[1 0 1 1](对应的对象为[狗、人、自行车、卡车])。这种分类被称为多标签分类。
|
弹性计算 虚拟化 异构计算
2023年阿里云GPU服务器租用价格表,附阿里云GPU服务器常见问题解答
2023年阿里云GPU服务器租用价格表,附阿里云GPU服务器常见问题解答。阿里云GPU服务器租用价格表包括包年包月价格、一个小时收费以及学生GPU服务器租用费用,阿里云GPU计算卡包括NVIDIA V100计算卡、T4计算卡、A10计算卡和A100计算卡,GPU云服务器gn6i可享受3折优惠,阿里云百科分享阿里云GPU服务器租用价格表、GPU一个小时多少钱以及学生GPU服务器收费价格表:
740 0