4.2 Routing -- Defining Your Routes
一、概述
1. 当应用程序启动时,路由器负责显示模板,加载数据,另外还设置应用程序的状态。这是通过匹配当前URL到你定义的routes来实现的。
2. Ember app router中的Map方法可以被调用来定义URL映射。当调用Map时,你应该传递一个function,它将会被调用,this会被设置为一个对象,你可以用它来创建路由。
app/router.js
Router.map(function() {
this.route('about', { path: '/about' });
this.route('favorites', { path: '/favs' });
});
- 现在当用户访问/about,Ember.js将会渲染about模板。访问/favs将会渲染favorites模板。
3. 小心!你会得到一些默认的路由:route:application和route:index(对应的路径是"/")。
如果路径名字和路由名字一样你可以省略路径只写路由名字,例子:
app/router.js
Router.map(function() {
this.route('about');
this.route('favorites', { path: '/favs' });
});
在你的模板中,你可以使用{{link-to}}在路由之间跳转,使用和提供的路由方法相同的名字(例如/,名字是index)。
{{#link-to 'index'}}<img class="logo">{{/link-to}}
<nav>
{{#link-to 'about'}}About{{/link-to}}
{{#link-to 'favorites'}}Favorites{{/link-to}}
</nav>
{{link-to}}还会添加一个active类指向当前激活的路由。
4. 你可以通过创建一个Ember.Route子类为一个路由自定义行为。例如,自定义当用户访问"/"时应该发生什么,创建route:index:
app/routes/index.js
export default Ember.Route.extend({
setupController(controller) {
// Set the IndexController's `title`
controller.set('title', 'My App');
}
});
对于index template来说controller:index是开始的上下文。现在你已经设置了title,你可以使用下面的模板了:
<!-- get the title from the IndexController -->
<h1>{{title}}</h1>
(如果你没有明确定义controller:index,Ember.js会自动为你生成。)
5. Ember.js根据你传递给this.route的name推算出routes和controllers的名字。
| URL | Route Name | Controllerapp/controllers/ |
Routeapp/routes/ |
Templateapp/templates/ |
|---|---|---|---|---|
/ |
index |
↳index.js |
↳index.js |
↳index.hbs |
/about |
about |
↳about.js |
↳about.js |
↳about.hbs |
/favs |
favorites |
↳favorites.js |
↳favorites.js |
↳favorites.hbs |
二、Nested Routes
你可通过传递给this.route一个回调函数来定义一个嵌套的routes。
app/router.js
Router.map(function() {
this.route('posts', { path: '/posts' }, function() {
this.route('new');
});
});
这个路由器创建这些路由:
| URL | Route Name | Controllerapp/controllers/ |
Routeapp/routes/ |
Templateapp/templates/ |
|---|---|---|---|---|
/ |
index |
↳index.js |
↳index.js |
↳index.js |
| N/A | posts |
↳posts.js |
↳posts.js |
↳posts.hbs |
/posts |
posts.index |
↳posts.js↳ posts/index.js |
↳posts.js↳ posts/index.js |
↳posts.hbs↳ posts/index.hbs |
/posts/new |
posts.new |
↳posts.js↳ posts/new.js |
↳posts.js↳ posts/new.js |
↳posts.hbs↳ posts/new.hbs |
- 一个嵌套路由的名字包含它的祖先。如果你想切换到一个路由(通过transitionTo或者{{#link-to}}),确保使用路由的全名(posts.new或者new)。
- 也就是说,切换到posts或者创建一个链接到posts相当于切换到posts.index或者链接到posts.index。
- 和你希望的一样,访问/会渲染index模板。
- 访问/posts会有一点差异。它将会先渲染posts模板。然后,它将在posts模板的outlet中呈现posts/index模板。
- 最后,访问/posts/new将会先呈现posts模板,然后将会在它的outelet中呈现posts/new模板。
三、Resetting Nested Route Namespace
当你嵌套路由时,子路由不继承祖先的名字可能会是有益的。这允许你参考和重用一个给定的路由,也保持了类名较短。这相当于现在的行为弃用this.resource()函数。
你可以使用resetNamespace: true选项重新设置当前的"namespace":
app/roputer.js
Router.map(function() {
this.route('post', { path: '/post/:post_id' }, function() {
this.route('edit');
this.route('comments', { resetNamespace: true }, function() {
this.route('new');
});
});
});
这个路由器创建5个路由:
| URL | Route Name | Controller | Route | Template |
|---|---|---|---|---|
/ |
index |
app/controllers/index |
app/routes/index |
app/templates/index |
| N/A | post |
app/controllers/post |
app/routes/post |
app/templates/post |
/post/:post_id2 |
post.index |
app/controllers/post/index |
app/routes/post/index |
app/templates/post/index |
/post/:post_id/edit |
post.edit |
app/controllers/post/edit |
app/routes/post/edit |
app/templates/post/edit |
| N/A | comments |
app/controllers/comments |
app/routes/comments |
app/templates/comments |
/post/:post_id/comments |
comments.index |
app/controllers/comments/index |
app/routes/comments/index |
app/templates/comments/index |
/post/:post_id/comments/new |
comments.new |
app/controllers/comments/new |
app/routes/comments/new |
app/templates/comments/new |
- comments模板将会被加载在post的outlet中。所有在comments中的模板将会被加载在comments的outlet中。
- 对于comments资源来说,route,coutroller和view类名不会有post前缀。
四、Multi-Word Model Names
对于多字的models所有的名字都是驼峰命名除了动态字段。例如,一个model命名为BigMac将会有一个这样的路径/bigMacs/:big_mac_id,路由被命名为bigMac,模板被命名为bigMac。
五、Dynamic Segments
1. 路由处理器的一个职责是把一个URL转换为一个模型。
例如,如果我们的路由是this.route('posts'),我们的路由处理器将会是这样:
app/routes/posts.js
export default Ember.Route.extend({
model() {
return $.getJSON("/url/to/some/posts.json");
}
});
posts模板将会收到所有可用的posts列表作为它的上下文。
因为/posts代表一个复杂的模型,我们不需要任何额外的信息去了解要检索什么。然而,如果你需要一个路由代表一个单一的post,我们不会想要在路由器中硬编码每一个可能的post。
2. 输入动态字段。
一个动态字段是一个URL的一部分,它以:开始,紧随其后的是一个标识符:
app/router.js
Router.map(function() {
this.route('posts');
this.route('post', { path: '/post/:post_id' });
});
app/routes/post.js
export default Ember.Route.extend({
model(params) {
return $.getJSON("/url/to/some/posts/" + params.post_id + ".json");
}
});
如果在URL中不使用id属性,你应该在路由中定义一个序列化方法:
app/router.js
Router.map(function() {
this.route('post', { path: '/posts/:post_slug' });
});
app/routes/post.js
export default Ember.Route.extend({
model(params) {
// the server returns `{ slug: 'foo-post' }`
return Ember.$.getJSON('/posts/' + params.post_slug);
},
serialize(model) {
// this will make the URL `/posts/foo-post`
return { post_slug: model.get('slug') };
}
});
这个默认的serialize方法把model的id插入到路由的动态字段中。(例如:post_id)
六、Initial Routes(最初的)
应用程序中的一些路由是立即可用的:
- 当你的app第一次启动时会进入route:application。它渲染application模板。
- route:index是默认路由,当用户访问/时,将会渲染index模板(除非/已经被你自定义的路由重写)。
- 这些路由是每一个应用程序的一部分,所以你不用在你的app/router.js中指定它们。
七、Wildcard/Globbing Routes(通配符)
你可以定义通配符路由,它可以匹配更多路由。例如,当用户输入不正确的URL与你的app不匹配时,你需要一个catch-all路由。
app/router.js
Router.map(function() {
this.route('catchall', { path: '/*wildcard' });
});
比如所有的路由都有一个动态字段,当你使用{{link-to}}或者transitionTo编程进入路由时你必须提供一个上下文。
app/routes/application.js
export default Ember.Route.extend({
actions: {
error() {
this.transitionTo('catchall', 'application-error');
}
}
});
有了这个代码,如果错误冒泡到应用程序的路由,你的app将进入catchall路由并且在URL中显示/application-error。
4.2 Routing -- Defining Your Routes的更多相关文章
- A Quick Introduction to Linux Policy Routing
A Quick Introduction to Linux Policy Routing 29 May 2013 In this post, I’m going to introduce you to ...
- [Angular2 Router] Configuring a Home Route and Fallback Route - Learn An Essential Routing Concept
In this tutorial we are going to learn how to configure the Angular 2 router to cover some commonly ...
- Routes
Routes Routing lets you create your own URL paths, based on the path you can load a closure or a con ...
- Meandering Through the Maze of MFC Message and Command Routing MFC消息路由机制分析
Meandering Through the Maze of MFC Message and Command Routing Paul DiLascia Paul DiLascia is a free ...
- Difference between RouteTable.Routes and HttpConfiguration.Routes?
https://stackoverflow.com/questions/12533782/difference-between-routetable-routes-and-httpconfigurat ...
- Flume官方文档翻译——Flume 1.7.0 User Guide (unreleased version)(一)
Flume 1.7.0 User Guide Introduction(简介) Overview(综述) System Requirements(系统需求) Architecture(架构) Data ...
- 7.1SportsStore:Navigation and Checkout
准备示例项目 使用真实的产品数据 现在,要切换到使用真实的数据,从Deployd服务器获取. AngularJS通过一个叫做$http的服务,为Ajax请求提供支持.作者将在第三部分详细讲解它是怎么工 ...
- Understanding the Router
Understanding the Router Our module is coming along nicely. However, we're not really doing all that ...
- Ember.js学习教程 -- 目录
写在前面的话: 公司的新项目需要用到Ember.js,版本为v1.13.0.由于网上关于Ember的资料非常少,所以只有硬着头皮看官网的Guides,为了加深印象和方便以后查阅就用自己拙劣的英语水平把 ...
随机推荐
- POJ 1947 Rebuilding Road(树形DP)
Description The cows have reconstructed Farmer John's farm, with its N barns (1 <= N <= 150, n ...
- 基于Cocos2d-x学习OpenGL ES 2.0系列——你的第一个立方体(5)
在上篇文章中,我们介绍了VBO索引的使用,使用VBO索引可以有效地减少顶点个数,优化内存,提高程序效率. 本教程将带领大家一起走进3D--绘制一个立方体.其实画立方体本质上和画三角形没什么区别,所有的 ...
- 使用Editplus和Dev C++配置C++的编译运行环 境
或许大家会有疑问,为何不直接使用VC;VS;或Dev这些IDE呢?何必舍近求远.主要是因为写程序这么多年来已经习惯了Editplus,包括他的快捷键,语法自动完成,语法提示等等,Editplus用了这 ...
- Android英文文档翻译系列(1)——AlarmManager
原文:个人翻译,水平有限,欢迎看官指正. public class Ala ...
- java三方---->dom4j解析xml数据
Dom4j是一个易用的.开源的库,用于XML,XPath和XSLT.它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP.今天我们就开始Dom4j的学习. Dom4j的使用 ...
- MQTT-SN协议乱翻之实现要点
前言 本篇是MQTT-SN 1.2协议最后一篇翻译了,主要涉及实现要点,很简短. 需要支持QoS 值为 -1 QoS虽默认设置有0,1,2三个值,但还有一种情况其值为-1.来自客户端的PUBLISH消 ...
- apply的调用 http://bbs.51js.com/thread-82017-1-3.html
applay 这个是函数Function的方法为什么Array 也能调用这个函数?比如 function a (){ var kk = []; kk = ...
- [Java语言] HashMap,HashSet,Hashtable,Vector,ArrayList 的关系 <转>
这么几个比较常用的但是比较容易混淆的概念同出于 java.util 包.本文仅作几个类的浅度解析. (本文基于JDK1.7,源码来自openjdk1.7.) ├── Collection │ ├── ...
- kubernetes 创建tomcat 容器
方案一: 使用k8s dashboard 创建rc 1. 界面操作 提示:暂时 忽略 查看: 2.测试 由于是外部服务 直接用 节点的ip访问: 同样也是 第二个端口可以访问.感觉 跟之前的提 ...
- TweenLite简单运用
参考:TweenLite说明 1 ease TweenLite.to(nextLevelTip, 1.5, { x:0, ease:Bounce.easeOut } ); 2 delayCall 语法 ...