第1节《启动路由》 章节中为了能让单页应用顺利跑起来,我们提前介绍了简单的路由配置方法。我们已了解路由配置的目的是指定不同的url下对应的 模块节点(也叫做模块容器)内应该显示哪个模块的内容,它还有更多高级的用法如匹配路由通配符的配置、重定向等。

配置静态匹配路由

一个路由路径是具体的路径如//about,那么它们就属于静态路由。这里我们试着配置一个复杂点的静态匹配路由,在正常情况下,如果一个url的相对路径中存在两级目录,那么在模块结构中也有相应嵌套层数,如:

// 假如已知module/index.html、module/about.html中都已定义了一个不具名的嵌套模块节点
am.startRouter ( {
routes: function ( router ) { // 顶层路由路径为"/"时表示根目录,顶层模块的路由路径一般需以“/”开头
router.module ().route ( "/", "module/index", function ( childRouter ) { // 子路由中目录名配置为""时表示二级目录为空,此时相对路径为“/”将会匹配到此空目录。
// 配置空目录时,你也可以这样设置:childRouter.module ().defaultRoute ( "module/index/default" )
childRouter.module ().route ( "", "module/index/default" ).route ( "describe", "module/index/describe" );
} )
.route ( "/about", "module/about", function ( childRouter ) { // 配置路由路径时可传入一个路径数组,这样表示访问“/about/amaplejs”或“/about/amaple”都将映射到“module/about/amaplejs”模块
childRouter.module ().route ( [ "amaplejs", "amaple" ], "module/about/amaplejs" ).route ( "jquery", "module/about/jquery" );
} );
},
// ...
} );

匹配路由通配符

实际项目中我们经常需要多个甚至所有的路由路径都匹配同一个模块,如一个文章模块,不同id的文章都将匹配此模块,又比如一个页面的 header footer 模块总是保持原样。显然,这不可能在配置路由时使用数组列出所有的路由路径,此时我们就需要使用匹配路由通配符来解决这个问题:

am.startRouter ( {
routes: function ( router ) { // 匹配路由通配符以“:”开头
router.module ( "article" ).route ( "/article/:id", "module/article" );
// 这样如“/article/123”、“/article/456”、“/article/789”等都将会匹配module/article.html模块
},
// ...
} );

当url为/article/123时,文章模块的am.Module对象中将在param对象中创建id参数,你可以通过id的参数值获取对应的文章内容进行显示:

new am.Module ( {
mounted : function ( http ) {
var _this = this; // 此时this.param.id的值为"123",即:id通配符所匹配的字符串
// 使用http预定义插件请求数据
http.get ( "article?id=" + this.param.id, "json" ).done ( function ( res ) {
_this.state.title = res.title;
_this.state.content = res.content;
} );
}
} );

匹配路由通配符也支持在多级目录同时设置,这是会在param对象中创建多个对应的属性。

// 这是会在模块对象的param中创建date和id两个属性
router.module ( "article" ).route ( "/article/:date/:id", "module/article" );

匹配路由通配符还允许你通过正则表达式限制匹配的内容。

// “/article/:id(\\d+)”表示id通配符只匹配一位或多位的数字
// 如它可匹配“/article/123”,但不能匹配“/article/a123”
// 正则表达式中使用“\”转义时应该成双出现
router.module ( "article" ).route ( "/article/:id(\\d+)", "module/article" );

如果url从/article/123跳转到/article/456时文章模块不会被替换,但param.id的值被更新为456,这时文章模块的paramUpdated 生命周期函数 就会被调用。

重定向

通过router.redirect函数你可以从一个路径重定向到另一个路径,重定向的起始目录取决于当前正在匹配的路由目录:

am.startRouter ( {
routes: function ( router ) { // 在顶层目录中将“/”重定向到“/index”
router.redirect ( "/", "/index" );
// 重定向的优先级高于匹配模块,所以router.redirect函数可在route函数前面或后面调用,都会优先重定向路径 router.module ().route ( "/index", "module/index", function ( childRouter ) { // 重定向的匹配路径与跳转路径也可以设置通配符
childRouter.redirect ( "introduce/:title", "describe/:title" );
// 第二层的重定向起始目录为“/index/”之后的路径
// 如“/index/introduce/i_am_a_title”的“introduce/i_am_a_title”部分将会被这层的重定向匹配,并重定向到“describe/i_am_a_title” childRouter.module ().route ( "", "module/index/default" ).route ( "describe/:title", "module/index/describe" );
} );
},
// ...
} );

强制重新渲染一个模块

我们已了解有时候更新模块时部分模块不会被替换,这些模块不会被卸载重新渲染,但你有时可能希望它们回到初始化状态,这时router.forcedRender函数就可以帮上忙了,它能强制让一个本来不需卸载的模块卸载并重新渲染:

am.startRouter ( {
routes: function ( router ) { // 为“article”模块节点配置时直接调用forcedRender函数,该模块节点内渲染的模块都会强制重新渲染
router.module ( "article" ).forcedRender ().route ( "/article/:id", "module/article" );
},
// ...
} );

404错误路径设置

当加载一个或多个模块时,任意一个模块文件未找到时将会触发 404错误 路径的模块匹配,配置 404错误 路径如下:

am.startRouter ( {
routes: function ( router ) { // 调用router.error404函数设置404路径,此函数只能在最外层路由对象调用
// 错误路径建议以“/”开始
router.error404 ( "/404" ); // 为404路径配置渲染模块
router.module ( "article" ).route ( "/404", "module/404" );
// ...
},
// ...
} );

恭喜你,已学到最后一节了,快去实际项目中练习使用吧

回顾上一节:【AmapleJS教程】5. 插件

【Amaple教程】6. 路由配置的更多相关文章

  1. Spring Cloud架构教程 (四)服务网关(路由配置)

    传统路由配置 所谓的传统路由配置方式就是在不依赖于服务发现机制的情况下,通过在配置文件中具体指定每个路由表达式与服务实例的映射关系来实现API网关对外部请求的路由. 没有Eureka和Consul的服 ...

  2. 【Amaple教程】2. 模块

    正如它的名字,模块用于amaplejs单页应用的页面分割,所有的跳转更新和代码编写都是以模块为单位的. 定义一个模块 一个模块由<module>标签对包含,内部分为template模板.J ...

  3. 【Amaple教程】5. 插件

    Amaple 拥有非常强大插件功能,这也是它的突出功能之一,Amaple插件一般表现为功能块(函数)或功能块(包含一系列函数和属性的Object对象),它除了支持Amaple规范定义的插件外,还支持所 ...

  4. angular2地址栏路由配置

    一步一步route过去可以,地址栏直接写url怎么就找不到了呢? 这关乎于Nodejs的express路由规则(http://hm4123660.iteye.com/blog/2195035) exp ...

  5. ionic入门教程-ionic路由详解(state、route、resolve)(转)

    http://blog.csdn.net/onil_chen/article/details/51758696?appinstall=0 今天好好的跟大家讲讲ionic的路由配置. 问到的朋友有点多, ...

  6. .NetCore MVC中的路由(1)路由配置基础

    .NetCore MVC中的路由(1)路由配置基础 0x00 路由在MVC中起到的作用 前段时间一直忙于别的事情,终于搞定了继续学习.NetCore.这次学习的主题是MVC中的路由.路由是所有MVC框 ...

  7. ASP.NET WebForms MapPageRoute 路由配置

    MapPageRoute 应该是 ASP.NET 4.0 中的东西,但现在我是第一次使用它,使用场景是:MVC 混合使用 WebForm,然后对 WebForm 进行路由配置,当然也可以使用 ISAP ...

  8. MVC路由配置

    目录 URL Routing 的定义方式 示例准备 给片段变量定义默认值 定义静态片段 自定义片段变量 自定义片段变量的定义和取值 将自定义片段变量作为Action方法的参数 指定自定义片段变量为可选 ...

  9. ui-router带参数的路由配置

    ui-router带参数的路由配置 使用ng-route的时候带参数的连接这样配置: $routeProvider.when('item/itemid/:itemid', { templateUrl: ...

随机推荐

  1. node安装依赖

    node 版本:v6.11.2 npm 版本:3.10.10 开发(在UI目录下) # 安装依赖 npm install    ## 若上述不行则采取下面命令 npm install --regist ...

  2. 005.前端开发知识,前端基础CSS(2020-01-14)

    一.CSS权重 权重是可以叠加的,事例如下: div ul li ------> 0,0,0,3 .nav ul li ------> 0,0,1,2 a:hover -----—> ...

  3. spring cloud解决eureka的client注册时默认使用hostname而不是ip

    eureka的client注册到server时默认是使用hostname而不是ip.这样的话使用feign client通过eureka进行服务间相互调用时也会使用hostname进行调用,从而调用失 ...

  4. Linux中vim的基本操作

    Vim三种模式之间的相互转换: 1.拷贝当前行 yy,拷贝当前行的向下五行 5yy,粘贴使用p: 2.删除当前行 dd,删除当前行的向下五行 5dd: 3.在文件中查找某个单词[命令行模式下  /关键 ...

  5. Django+Ajax+Mysql实现数据库数据的展示

    最近老师让搞一个系统,仅仅展示一下数据库的数据 在做海底捞时,是交接的师兄的项目,用的语言是java,框架是SSM(Spring.SpringMVC.MyBatis),这次我准备用Python写,前端 ...

  6. jstl引入报错

    jstl1.0的引入方式为: <taglib uri="http://java.sun.com/jstl/core" prefix="c" /> j ...

  7. Nginx笔记总结十三:sub_filter内容替换

    Nginx变异安装加上参数 --with-http_sub_module 配置文件: location ~* ^/portalproxy/([-]*)/portal(.*)$ { #sub_filte ...

  8. maven依赖找不到,快速解决

    以微信支付依赖为例子 wxpay-sdk-3.0.9.jar1.阿里云仓库搜索地址https://maven.aliyun.com/mvn/search 2.搜索你要找的依赖,对号入座 3.确保mav ...

  9. unittest(20)- 自动更新表格中数据(5)

    # 1. get_data.py from tools import project_path import pandas as pd class GetData: Cookie = None Add ...

  10. 吴裕雄--天生自然python编程:turtle模块绘图(1)

    Turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x.纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行 ...