当前位置: 首页 > Web前端 > HTML5

Angular路由导航的7个步骤

时间:2023-04-05 15:28:44 HTML5

7路由过程的步骤每次单击链接或浏览器URL更改时,Angular路由器都会确保应用程序做出相应的反应。为了做到这一点,Angular路由器执行以下7个步骤序列:解析:它解析用户想要导航到的浏览器URL。重定向:它应用URL重定向(如果已定义)识别:它识别哪个路由器状态对应于URL。守卫:它运行路由器状态中定义的守卫。Resolve:解析路由器状态所需的数据。激活:它激活Angular组件以显示页面。管理:它管理导航并在请求新URL时重复该过程。牢记这7个步骤,您可以使用助记符PRIGRAM,其中每个字母代表路由过程中的一个步骤:ParseRedirectIdentifyGuardResolveActivateManage在我们深入每个步骤之前,让我们回顾一下Angular路由器使用的术语。术语routerservice:我们应用中Angular的全局路由服务routerconfiguration:定义我们应用中所有可能的router状态routerstate:路由器在某个时间点的状态,表示为一个活跃的路由快照树。激活的路由快照:提供对路由器状态节点的URL、参数和数据的访问。Guards:在加载、激活或停用路由时运行的脚本。解析器:在请求的页面被激活之前获取数据的脚本路由器出口:Angular路由器可以放置激活组件的DOM中的位置URL段:URL的斜线部分,如果你不熟悉Angular路由器或任何这些名词听上去很陌生,强烈推荐你先阅读UseAngularroutertoresolvedata,官方路由指南或者Angular主要作者VictorSavkin的书AngularRouterStep1ResolvingBrowserURL在Angular路由器方面,浏览器URL是一个字符串,代表路由器的状态。由于路由器状态是一棵树,因此Angular路由器本质上考虑的是浏览器URL的序列化树。在路由过程的第1步中,Angular路由器将浏览器URL解析为URL树。URL树是一种数据结构,稍后将帮助Angular路由器在第3步中识别路由器状态树。为了解析URL,Angular使用以下约定:(注意:冒号前面是路由器出口,后面是URL片段)/=>斜杠分隔URL片段()=>括号指定次级路径。:=>冒号指定特定的路由器出口。;=>分号指定矩阵参数。?=>一个问号分隔查询字符串参数。'#'=>枚举片段的#标签。'//'=>双斜杠分隔多个辅助路径。例如,在解析以下URL时:/section-one;test=one/(nav:navigation;test=two//main:about;test=three)?query=four#fragangular识别以下部分(单击此处获得更大的版本):'section-one'、'navigation'和'about'是URL段';test=one'、';test=two'和';test=three'是矩阵参数'(nav:navigation;test=two)'为二级路由,列出了出口路由'nav'的url片段'navigation',并赋值了自己的矩阵参数test,其值为字符串类型的'two'(main:about;test=three)是二级路由,列出了导出路由'main'的URL片段'about',并赋值了自己的矩阵参数test,其值为字符串类型的'three''//',用于分隔二级路由.'?query=four'分配查询字符串变量'query'和字符串值'four''#frag'分配片段'frag'矩阵参数在路由级别范围内。).不同的路由可以有同名不同值的矩阵参数。相反,查询字符串参数和片段不在路由级别范围内。它们由路由共享,因此它们的名称应该是唯一的。一旦Angular路由器组装了URL树,它将继续执行第2步。第2步重定向在Angular路由器使用URL树创建路由器状态之前,它会检查相应的重定向规则。有两种不同的重定向类型:本地重定向:当'redirectTo'不以'/'开头并将其替换为单个URL片段时,例如:{path:'one',redirectTo:'two'}绝对重定向:当'redirectTo'是替换整个以'/'开头的URLeg:{path:'one',redirectTo:'/two'}Angularrouter遍历路由器配置。一旦找到匹配的重定向,就应用重定向,路由器继续执行第3步。只应用一个重定向规则!如果路由1重定向到路由2,路由2重定向到路由3,然后路由2重定向到路由3没有执行,路由2被激活。(如果路由1重定向到路由2,路由2又重定向到路由3,则不会执行到路由3的第二次重定向并激活路由2。)步骤3识别路由器状态此时,Angular路由器有一个潜在的重定向application程序的URL树。Angular路由器遍历URL树并将URL片段与路由器配置中配置的路径相匹配。如果URL片段与路由的路径匹配,则路由的子路由与剩余的URL片段匹配,直到所有URL片段匹配。如果没有找到确切的路由器匹配项,则回溯到下一个兄弟路由器以找到匹配项。考虑以下路由器配置:[{path:'one',component:OneComponent,children:[{path:'two/three',component:OtherComponent]}]和以下URL:/one/two/three然后Angular路由器将找到包含两个路由的匹配项:路径为“一”的路由匹配一个URL片段路径为“二/三”的子路由匹配两个URL片段一旦Angular路由器找到一个完整的匹配项,消耗所有的URL片段,路由器状态被构建,路由器继续执行第4步。请注意,Angular路由器没有路由精度的概念。一旦找到完全匹配项,Angular路由器就会停止处理配置。因此,确保以正确的顺序配置路由非常重要。如果将通配符路由添加为第一条路由,则不会到达其他路由并且通配符路由将始终匹配。因此,您应该始终将通配符路由添加为路由器配置中的最后一条路由。如果处理了整个路由器配置但没有匹配项,则路由器导航失败并记录错误。第4步RouteGuards-运行RouteGuards现在Angular路由器知道要路由哪个路由器状态,它运行关联的守护进程来检查是否允许它导航到新的路由器状态。首先,它按照从“最深子路由”到“顶级”的顺序运行以下守卫进程:CanDeactivateCanActivateChild然后,它从“顶级”到“最深子路由”依次运行以下守卫进程:state需要延迟加载模块,然后还会运行以下守护进程:CanLoad守护进程必须返回布尔值或解析为布尔值的promise/observable。当守护程序返回假值时,导航将被取消。如果没有守卫返回假值,Angular路由器继续执行第5步。第5步Resolve-运行解析器因为Angular路由器知道可以激活新的路由器状态,所以它运行相关的解析器。在配置期间,可以使用路由的数据属性将静态数据附加到路由:{path:'one',component:OneComponent,data:{name:'Jazz'}}这允许您在运行时动态解析数据。然后将新解析的数据合并到data属性中已有的静态数据中:path:'one',component:OneComponent,data:{name:'Jazz'},resolve:{//AddressResolver的返回值会合并到data中//并将作为data.addressaddress:AddressResolver}解析器是具有返回值、承诺或可观察值的函数或类。如果解析器返回一个promise或一个可观察对象,Angular路由器会等待它完成,然后再继续执行第6步。一旦所有解析都已完成,其返回值是合并路径的数据属性,Angular路由器就会继续执行第6步。第6步激活组件在这一步中,Angular路由器实例化所需的组件并将它们放置在DOM中,并在元素中使用正确的相应路由器出口。如果一个组件已经在之前的路由器状态中被实例化,或者如果只有路由参数发生了变化,那么该组件将不会被重新实例化。但是组件也重新激活(reactivated),可以通过observable对象activatedroute使用新的参数。当所有组件都被实例化或重新激活时,Angular路由器会更新浏览器URL中的URL。步骤7管理导航最后,当新的路由器状态显示在屏幕上时,Angular路由器会监听URL变化和状态变化。一旦发生以下情况之一:用户更改浏览器URL用户单击链接(使用routerlink)执行导航命令(使用router.navigate)Angular路由器重复整个过程。总结在本文中,我们了解了当用户从一个页面导航到另一个页面时Angular路由器的作用。您可以使用助记符PRIGRAM:ParseRedirectIdentifyGuardResolveActivateManage来记住Angular路由器执行的步骤顺序。了解这个过程将帮助您更好地了解幕后发生的事情,并帮助您调试潜在的路由问题。下次有人问你在Guard之前或Resolve之后发生了什么,你就会知道该说什么了。希望有的读者喜欢!参考资源Angular路由导航的7步流程