Angular 2.x折腾记 :(4)初步了解路由及使用

简介: 路由这块的水挺深,我这里扯扯我用过的一些特性及一丢丢的经验


前言


路由这块的水挺深,我这里扯扯我用过的一些特性及一丢丢的经验


概念性的东西



言简意赅的总结一下:


路由就是控制视图与视图之间的跳转,之间还可以传递参数什么的,路由的退后及前进不会完整的请求整个页面,还可以完全不请求(在生命周期里面控制);


  • angular 2 + 里面有两种url风格
  • 一个是常规我们访问url那种protocol://domain/path/f/fds
  • 一种的hash(#)风格,protocol://domain/#/account/login
  • 可以操控路由了,那必然就可以做鉴权了。。。
  • 路由相关的指令或者术语


  • <router-outlet> :路由占位符,可以理解为渲染路由组件的区域,一个组件只能一个无命名<router-outlet>,命名的可以多个
  • ng-content: 可以嵌套一个组件的内容在另外一个组件中!!很常用!
  • RouterLink:可以让一个元素具有跳转功能,里面有很多使用的参数[指令],我大体解释下常用的哈


  • queryParams : 可以传递参数的,跳转过去就是这种/security-alert?AlertType=50,可以接受对象
  • skipLocationChange : 内容跳转,路由保持不变,换句话说,就是停留在上个页面的url而不是新的url -- 常用!
  • fragment:代码片段拼接到url,只接受字符串,在url就是hash拼接;/security-alert#1232


  • ActivatedRoute: 当前活动的路由,非常常用,逻辑处理的时候经常用到,参数比上面多,大同小异
  • ActivatedRouteSnapshot:这个是上面的局部实现,路由镜像,用来获取一些路由的信息很方便,单独用上面的也可以拿到相关的路由信息
  • Router这个内置组件,是路由最重要的东东了,相对路由这些,绝对路径这些都可以实现,我这里也说说常用的
  • url: 获取url
  • routerState: 路由状态
  • navigateByUrl:绝对路径的跳转,有个可选参数[{relativeTo, queryParams, fragment, preserveQueryParams, queryParamsHandling,}?: NavigationExtras],可选参数就是上面那个停留在当前路径跳转这些
  • parseUrl:格式化url,实用!
  • navigate :配合可选参数可以实现当前路劲下的相对跳转,带参数跨页面跳转等

常规路由


import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
// 页面组件
import { NameComponent } from './name.component';
const routes: Routes = [
  { 
    path: 'path', // path是路由访问的路径
    component: NameComponent, //component是映射的组件
    children:[ // children是嵌套组件的包含层
        {
            path:'', //留空可以让路径默认指向第一个组件,访问时候没有带任何子路径情况下
            component:'ffff' // 对应的组件记得先提前引入
        },
        {
            path:'edit/:id', // 这样是代表子组件需要带一个参数才能进入
            component:'ggg' // 对应的组件记得先提前引入
        }
    ]
  } 
];
@NgModule({
  // 注入到模块中,forChild只能用于子模块,forRoot只能用于跟模块
  // forRoot有一个可选的配置参数,里面有四个选项
  // enableTracing :在console.log中打印出路由内部事件信息
  // useHash :把url改成hash风格,protocol://domain/#/account/login
  // initialNavigation : 禁用初始导航,没用过。。
  // errorHandler :使用自定义的错误处理,来抛出报错信息;
  imports: [RouterModule.forChild|Root(routes)], 
  // exports是导出组件,一般用于自定义组件或者模块。。
  exports: [RouterModule],
})


懒加载


import { ModuleWithProviders } from '@angular/core';
// 路由相关模块
import { Routes, RouterModule } from '@angular/router';
// 布局
import { MitLayoutComponent } from './widgets/mit-layout/mit-layout.component';
// 鉴权服务
import { RbacService } from './rbac/rbac.service';
const routes: Routes = [
  {
    path: '',
    redirectTo: '/page/dashboard/vehicle-overview',
    pathMatch: 'full', // 匹配全局,默认是'prefix','full'是全局匹配/
    canActivate: [RbacService] // canActivate是内置拦截器,RbacService是鉴权服务
  },
  {
    path: 'page',
    component: MitLayoutComponent,
    canActivate: [RbacService],
    children: [ // 懒加载在目前的版本都必须用绝对路径指向对应的模块,dashboard.module是文件名,#DashboardModule是里面到处的模块,必须紧跟才能正确识别
      { path: 'base-data', loadChildren: 'app/modules/base-data/base-data.module#BaseDataModule' }, // 基础数据
  },
  {  // 账号相关
    path: 'account',
    loadChildren: 'app/modules/account/account.module#AccountModule',
  },
  {
    path: 'event',
    loadChildren: 'app/modules/mobile-alarm/mobile-alarm.module#MobileAlarmModule' // 安全警报移动端处理
  },
  { path: 'error', loadChildren: 'app/modules/error/error.module#ErrorModule' }, // 错误
  { path: 'not-found', redirectTo: 'error/404' }, // 404 
  { path: '**', redirectTo: 'error/404' } // 错误 , 没有匹配到任何路径的都跳转到404
];
// ModuleWithProviders 是个接口,就是允许ngModule和providers类型
export const AppRoutes: ModuleWithProviders = RouterModule.forRoot(routes, { useHash: true });
// 上面这种写法只是把路由到处到一个变量,也就是要生效必须到相应的模块中引入(NgModule)中import进去


小技巧


获取url的id


// 根据是否存在id判断是新增还是修改
  checkAction() {
    // 用activatedRoute来获取url上对应的参数
    this.activatedRoute.params.subscribe((params: { id: number }) => {
      if (params.id) {
        this.id = params.id;
      } else {
        this.showLoading = false;
      }
    });
  }
  // 这种是直接获取queryParam
  this.activatedRoute.queryParams.subscribe(
      (res: { AlertType: string }) => {
        console.log(res);
      },
      (err):never => {
        console.log('我靠,网络错误');
      }
    );


返回上个页面


// 取消
  back() {
    // 这里判断id,url进来的带了一个关联id,比如你要查看一个用户的详细信息,根据id关联
    // 在这个页面获取到这个id,然后进行的路由的相对跳转
    if (this.id) {
      this.router.navigate(['../../'], { relativeTo: this.activatedRoute });
    } else {
      this.router.navigate(['../'], { relativeTo: this.activatedRoute });
    }
  }
目录
相关文章
|
8月前
|
JavaScript 前端开发 应用服务中间件
angular引入包、路由权限配置、打包问题与nginx配置问题(简单部署)
angular引入包、路由权限配置、打包问题与nginx配置问题(简单部署)
187 0
|
5月前
|
SEO 搜索推荐 数据采集
让 JSF 应用秒变搜索引擎宠儿!揭秘 SEO 优化的神奇魔法,让你的网站脱颖而出!
【8月更文挑战第31天】随着互联网的发展,搜索引擎已成为用户获取信息的主要途径,SEO 对 Web 应用至关重要。本文介绍如何提升 JavaServer Faces(JSF)应用的 SEO 友好性,包括关键词优化、网页结构优化和外部链接建设等基础知识,并提出了使用语义化 HTML 标签、优化页面标题和描述、生成静态 HTML 页面及 URL 重写等具体策略,帮助您的网站在搜索引擎中获得更高排名。
38 0
|
5月前
|
安全 开发者
精通Angular路由管理:从基础设置到高级配置,打造复杂SPA导航系统的全方位指南
【8月更文挑战第31天】在单页应用(SPA)中,路由管理至关重要。Angular通过其强大的路由模块提供灵活高效的解决方案。本文通过代码示例详细介绍如何在Angular中设置和管理路由,包括基础路由配置、懒加载、路由保护及高级配置,帮助开发者构建高效安全的导航系统,满足复杂SPA需求。随着Angular的发展,路由管理将更加完善,值得持续关注。
51 0
|
5月前
|
JavaScript 前端开发 API
如何在 Angular 路由中使用路由解析器
如何在 Angular 路由中使用路由解析器
44 0
|
5月前
如何在 Angular 路由中使用路由守卫
如何在 Angular 路由中使用路由守卫
67 0
|
5月前
如何在 Angular 路由中使用查询参数
如何在 Angular 路由中使用查询参数
37 0
|
5月前
|
JavaScript 前端开发 测试技术
如何在 Angular 中使用懒加载路由
如何在 Angular 中使用懒加载路由
55 0
|
8月前
【超实用】Angular如何修改当前页面网页浏览器url后面?param1=xxx&param2=xxx参数(多用于通过浏览器地址参数保存用户当前操作状态的需求),实现监听url路由切换、状态变化。
【超实用】Angular如何修改当前页面网页浏览器url后面?param1=xxx&param2=xxx参数(多用于通过浏览器地址参数保存用户当前操作状态的需求),实现监听url路由切换、状态变化。
【超实用】Angular如何修改当前页面网页浏览器url后面?param1=xxx&param2=xxx参数(多用于通过浏览器地址参数保存用户当前操作状态的需求),实现监听url路由切换、状态变化。
|
8月前
几个经常用到的angular路由Router、ActivatedRoute 知识点:嵌套路由、路由跳转、路由传参、路由参数获取
几个经常用到的angular路由Router、ActivatedRoute 知识点:嵌套路由、路由跳转、路由传参、路由参数获取
几个经常用到的angular路由Router、ActivatedRoute 知识点:嵌套路由、路由跳转、路由传参、路由参数获取
|
8月前
|
JavaScript
解决vue项目build之后部署到服务器访问的时候出现报错:Uncaught SyntaxError: Unexpected token ‘<‘ chunk-vendors:XXXXXX
解决vue项目build之后部署到服务器访问的时候出现报错:Uncaught SyntaxError: Unexpected token ‘<‘ chunk-vendors:XXXXXX
解决vue项目build之后部署到服务器访问的时候出现报错:Uncaught SyntaxError: Unexpected token ‘<‘ chunk-vendors:XXXXXX