欢迎各位兄弟 发布技术文章
这里的技术是共享的
开始正片吧,例如现在我们有两个组件,一个是新闻列表list.component
;另一个是新闻新闻详情detail.component
。根据组件的功能我们应该是从新闻列表页面进入详情页面,根据列表中条目的文章ID请求数据调用详细的文章信息然后展示给用户查看。我们如何在列表页把文章ID传给详情页呢?
共有四种方式。确切说是分成两大类共四小类,我给大类定义的名字是主动跳转传值和触发跳转传值,两种方式都包含有get跳转和动态路由两种方式来实现,这样也就就是四种了下面一一道来:
前提是我们在app-routing.module.ts
中已经添加了相关的路由条目,嗯!我们先不考虑RouterModule.forRoot()
和RouterModule.forChild()
的区别和应用场景,为了方便理解记忆路由传值,在这里这里面我们把所有的路由信息都写到了app-routing.module.ts
中
newslist.component.html
中使用ngfor调用列表,使用routerLink
属性来定义跳转路由地址,使用queryParams
属性来定义要传递的值。注意值的形式,别搞错了。不管是字符串还是变量都要有" "
来包裹,而字符串还要再多一层' '
detail.component
中使用ActivatedRoute
模块的queryParams
方法来接受传递过来的数据,需要注意的queryParams
是一个RXJS对象需要用subscribe
订阅来调用返回值。
部分代码已经省略,可以比较前面的代码。首先需要在路由文件中定义路由信息,这也是get方式和动态路由的区别之一,get方式不用设置路由信息,而动态路由顾名思义是需要设置路由信息的。
路由信息中添加动态路由:
然后是路由跳转,不使用queryParams
属性跳转,而是routerLink
属性传值的时候内部的数组中,这个第二项附带上要传的值(数组下标1)。
最后接受发送的数据,这里还是使用ActivatedRoute
模块,但是不再使用queryParams
方法,而是用params
方法,而且params
也是一个RXJS对象同样还是要用subscribe
订阅来调用返回值。
前面所说的例子都是依附于html<a>
标签,言外之意就是需要用户来点击才能触发路由跳转,如果使用场景中不需要用户点击而是根据条件判断结果自动跳转,例如判断用户是否已经登录,如果是自动登录状态就让用户自动跳转到指定页面,如果没有就自动跳转到登录页面。这个情况下使用angular的routerLink
就会有点力不从心了。
这个时候我们就可以通过封装JS跳转的方法,在判断条件满足时,自动触发该方法即可。既然是触发跳转的路由跳转,那么肯定还是和我们的路由信息有关联,还是在app-routing.module.ts
中添加路由信息:
我们使用Router
模块。注意这个地方别写错了。Routes
是路由信息配置的类,ActivatedRoute
模块是接受传来数据时用的模块,RouterModule
是路由模块,Router
模块是JS路由跳转用的模块,有点乱……没关系通过一个表格,有助于我们记忆。
使用Router
的navigate
方法来进行跳转,传递格式和动态路由一样。
这和get方式跳转一样,不需要路由信息的支持,直接传递就可以。不过我们需要额外引入一个NavigationExtras
的类来定义传递的信息。
定义传参,get跳转传值:
后记:其实我觉得这篇文章叫路由跳转方式比较贴切,嘿嘿……
来自 http://events.jianshu.io/p/1de6d86eade5