angularjs路由,angular动态路由配置
本文是对Angular的高级研究。下面我们来仔细看看Angular里的路线和形态,希望对你有所帮助!
Angular的路由介绍
在单页面应用中,你需要在不同定义的视图中(组件)之间来回切换,而不是去服务器获取新页面。要实现从一个视图到另一个视图的导航,需要在角度上使用Router。【相关教程推荐:《angular教程》】
路由创建
1.创建一个新文件app-routing.module.ts,把要跳转的视图的配置放进去。
从“@angular/core”导入{ ng module };
//介绍路由模块RouterModule和路由
从“@angular/router”导入{ Routes,router module };
//介绍不同URL下需要显示的组件
从“”导入{ GoodsListComponent }。/goods-list/goods-list . component ;
从“”导入{ PersonalCenterComponent }。/personal-center/personal-center . component ;
//配置的路由阵列
const routes: Routes=[
{
Path: goodsList ,//定义路由名称
Component: goodlistcomponent,//指定显示哪个组件。
},
{
Path: personalCenter ,//定义路由名称
component:personal center component,//指定要显示哪个组件。
}
];
@NgModule({
forroot()方法创建一个NgModule,其中包含所有的指令、给定的路由以及路由器服务本身。
导入:[RouterModule.forRoot(routes)],
导出:[RouterModule]
})
类处理模块{} 2。在app.module.ts中导入AppRoutingModule
从“”导入{ AppRoutingModule }。/app-routing . module ;3.在app.component.html中添加这些路线以控制导航的显示。
div class=路由-更改-容器
A routerLink=/goodsList 切换到商品列表组件/a!- routerLink将您定义的路由连接到模板文件-
A routerLink=/personalCenter 切换到个人中心组件/a
/div
路由器出口/路由器出口!-该指令通过路由-路由中两个重要API的介绍动态加载组件
ActivatedRoute
用于{获取路线信息}获取路线信息。它包含路由信息,如路由参数、静态数据.具体方法请参考ActivatedRoute官网。
从“@angular/core”导入{ Component,on init };
从“@angular/router”导入{ activated route };//先介绍ActivatedRoute。
@组件({
选择器:“应用程序-商品-列表”,
templateUrl:“”。/goods-list.component.html ,
样式URL:[。/goods-list.component.scss]
})
导出类GoodsListComponent实现OnInit {
构造器(
私有路由:激活路由,//该服务的依赖注入
) {}
//URL在初始化生命周期中的路由信息
public ngOnInit(): void {
//获取参数的第一种方法
const params=this . route . snapshot . params;
//获取参数的第二种方法
this . route . params . subscribe(params={
console . log(params);
});
}
}
Router
是{提供导航和URL操作}提供导航和URL操作的模块。具体方法请参考路由器官网。开发中常用的方法如下。具体解释将在路由参考中详细介绍:
//使用之前,需要在组件中引入路由器服务类。
从“@angular/router”导入{ Router };navigate()该方法支持与routerLink指令相同的参数类型,因此它们的功能是相同的;
navigateByUrl()绝对路线;
每次导航前会调用events方法;(暂时只知道)
路由传参以及获取
路由传参的两种形式
1. params (是/:id 动态路由)
使用场景:例如,当我们点击商品列表的链接时,我们希望通过url将用户信息或商品类别信息传递给商品列表的组件。
//需要配置路由
const routes: Routes=[
{
Path: goodsList/:id ,//定义路由名称
Component: goodlistcomponent,//指定显示哪个组件。
},
];2. queryParams(是?id=xx 形式)
使用场景:当我们想通过url传递多个参数时,可以选择这样路由和传递参数。
路由中传参的3种具体方法
1. routerLink
单一参数:
A [routerlink]= [/goodslist ,id] router link ative= active-class 切换到商品列表组件/a
//其中/goodlistl是我设置的路由路径,id是需要传递的参数
//当有多个参数时,也可以用这个形式。只是看起来不够直观,所以在不推荐多个参数的时候也可以用这个方法:
a[router link]=[/personal center ][query params]= { name: zs ,age: 16} 切换到个人中心组件/a
//参数的格式可以自己组织成各种对象2. router.navigate。
单一参数:
public goToGoodsListPage():void {
//第一种方式
这个。_ router . navigate([`/goods list/$ { this . id } `]);
//第二种方式达到了与第一种方式相同的效果
这个。_router.navigate([/goodsList ,this . id]);
}
//在HTML中调用此方法等效于使用A标记的routerLink属性。
按钮(点击)= gotogoodlistpage()切换到商品列表组件/按钮多个参数:
public goToPersonalCenterPage():void {
这个。_ router . navigate([/personal center ],{queryParams:{name: zs ,age:16 } });
}
//在HTML中调用
按钮(点击)= gotopersonalcentrepage()切换到个人中心组件/按钮3. router.navigateByUrl
//传递的第一个参数是数组的形式,而navigate的第一个参数是数组的形式。
//他的引用当前拼接在url上。
public goToPersonalCenterPage():void {
这个。_ router . navigatebyurl(`/personal center?name=z sage=16 `);
}
在路由中接收参数的2种方式
1. 接收params类型的参数
从“@angular/router”导入{ activated route };
构造器(
private _route: ActivatedRoute,
) {}
public ngOnInit(): void {
//仅获取初始值的第一种方法
const param=this . route . snapshot . params;
//第二种动态采集方法
this . route . params . subscribe(params={
console . log(params);
});
}2. 接收queryParams类型的参数
从“@angular/router”导入{ activated route };
构造器(
private _route: ActivatedRoute,
) {}
public ngOnInit(): void {
//仅获取初始值的第一种方法
const query param=this . route . snapshot . query params;
//第二种动态采集方法
this . route . query params . subscribe(params={
console . log(params);
});
}路由重定向
应用场景:当你希望用户在一个应用中默认跳转到一个页面时,需要使用获得的路由重定向。
重定向的组成:
使用重定向源的路径重定向目标的componentpathMatch的值配置路由{path: ,
重定向到:“/personalCenter”,
PathMatch: full },//重定向到 personal center `{ Path match } Path match是一个字符串,用于{指定路由匹配策略}指定路由匹配策略。选项包括前缀(默认)和完整。
路由顺序
路由器在匹配路由时采用的是“{先到先服务}的策略,所以要把{具体静态路由}放在前面,然后把{默认路由匹配}默认路由匹配的空路径路由放在最后,{通配符}通配符路由是最后一个(他可以匹配所有路由,只有没有其他路由匹配时路由器才会选择他)。
const routes: Routes=[
//静态路由
{
路径: goodsList/:id ,
组件:GoodsListComponent,
},
{
路径:“个人中心”,
组件:PersonalCenterComponent,
},
//默认空路径路由
{
路径: ,
重定向到:“/personalCenter”,
路径匹配:“满”
},
//通配符路由
{路径:“**”,组件:PageNotFoundComponent },
];路由嵌套
当应用变得复杂时,可能需要在根组件之外创建一些相对路由,这些路由成为子路由,这意味着需要在项目中增加第二个{router-outlet}路由器出口,因为它是除AppComponent之外的另一个{router-outlet}路由器出口。
场景:我们需要在个人中心的页面中跳转到他的两个子页面,分别是{个人配置页面}个人配置页面和{个人详情页面}个人详情页面。具体代码实现如下:
从“@angular/core”导入{ ng module };
从“@angular/router”导入{ Routes,router module };
从“”导入{ GoodsListComponent }。/goods-list/goods-list . component ;
从""导入{ PersonalCenterComponent } ./个人中心/个人中心。组件;
从""导入{ PersonalSettingComponent } ./个人设置/个人设置。组件;
从""导入{ PersonalDetailComponent } ./个人详细信息/个人详细信息。组件;
const routes: Routes=[
{
路径: goodsList/:id ,
组件:GoodsListComponent,
},
{
路径:"个人中心",
组件:PersonalCenterComponent,
孩子:[ //主要是这里添加了一个孩子们数组,用来存放子路由
{
路径:“personalDetail”,
组件:PersonalDetailComponent,
},
{
路径:"个人设置",
组件:PersonalSettingComponent,
},
]
},
{
路径: ,
重定向到:"/personalCenter ",
路径匹配:"满"
},
];
//个人中心的超文本标记语言中,需要新增路由器出口从而来指定子页面展示的位置
div class=个人-中心-容器
这是个人中心页面
路由器链接= ./个人详细信息切换个人详情页面/a
路由器链接= ./个人设置切换到个人配置页面/a
/div
路由器出口/路由器出口路由懒加载
你可以配置路由定义来实现惰性加载模块,这意味着有角的只会在{需要时}需要时才加载这些模块,而不是在应用{启动时}启动时就加载全部。
1、先给之前的两个页面组件增加一个组件文件,然后路线中使用装载儿童代替成分进行配置
从" @角度/核心"导入{ ng模块};
从" @angular/router "导入{ Routes,路由器模块};
const routes: Routes=[
{
路径: goodsList/:id ,
loadChildren: ()=import(./货物清单/货物清单。模块’)。然后(m=m.GoodListModule)
},
{
路径:"个人中心",
loadChildren: ()=import(./个人中心/个人中心。模块)。然后(m=m .个人中心模块)
},
{
路径: ,
重定向到:"/personalCenter ",
路径匹配:"满"
},
];
@NgModule({
//forRoot()方法会创建一个NgModule,其中包含所有指令、给定的路由以及路由器服务本身。
导入:[RouterModule.forRoot(routes)],
导出:[路由器模块]
})
导出类处理模块{}2,在之前的两个页面组件中添加路由模块文件,添加一个指向该组件的路由。
从" @角度/核心"导入{ ng模块};
从" @angular/router "导入{ Routes,路由器模块};
从""导入{ GoodsListComponent } ./货物清单。组件;
const routes: Routes=[
{
路径: ,
组件:GoodsListComponent
},
];
@NgModule({
进口:[路由器模块。对于子(路线)],
导出:[路由器模块]
})
导出类GoodsListRoutingModule { }路由守卫(仅了解)
使用路由守卫来防止用户未经授权就导航到应用的某些部分,想了解更多请移步路由守卫官网介绍
用可以激活来处理导航到某路由的情况。 //进入路由的时候用被激活的儿童来处理导航到某子路由的情况。用CanDeactivate来处理从当前路由离开的情况。//离开路由的时候用分解在路由激活之前获取路由数据。用CanLoad来处理异步导航到某特性模块的情况可以激活。仍然会加载某个模块,canload不会去加载当不满足条件的情况下导出类测试卫士实现可以激活
能激活(
接下来:ActivatedRouteSnapshot,
state:RouterStateSnapshot):boolean {
//判断是否可以进入某个路由的逻辑
}
}{
路径:"测试路径",
组件:测试组件
可以激活:[测试卫士],//使用路由守卫防护装置
}路由事件(仅了解)
路由器在每次导航过程中都会通过路由器。事件属性发出导航事件。这些事件的范围贯穿从导航开始和结束之间的多个时间点。想了解更多请移步
Angular中的表单介绍
响应式表单与模板驱动表单的区别
表单模型显示的响应式模板驱动创建、组件类中的隐式创建、数据模型的指令创建结构化和不可变(可观察对象)非结构化和可变(数据双向绑定)数据流同步异步表单验证函数指令常用表单公共基础类
响应式表单和模板驱动表单基于以下基本类。
FormControl实例用于跟踪单个form控件的值和验证状态。
FormGroup用于跟踪表单控件组的值和状态。
FormArray用于跟踪表单控件数组的值和状态。(理解)
模板驱动表单
{ Dependence }依赖模板中的{instruction}指令来创建和操作底层对象模型。主要用于添加简单表单,简单易用,但扩展性不如响应式表单。当控件值更新时,相关的属性值将被修改为新值。
创建表单
!- #form是模板引用变量,所以表示form的整个元素。我们可以在当前模板的任何地方使用模板引用变量。-
!-这些变量提供了直接从模块中访问元素的能力-
!- name name必须添加,因为表单中的所有组件和控件都应该有名称-
form(ngSubmit)= on submit(my form . value);# myform= ngForm novalidate
Label= name Name: /label
输入类型= text name= name [(ng model)]= name
=password 密码的标签:/label
输入类型=密码名称=密码[(ngModel)]=密码
提交按钮/按钮
/form
模板驱动表单中验证输入
!-如果我们要检查上面的表格,密码不能为空,姓名长度不能少于2个字符-
form(ngSubmit)= on submit(my form);#myform=ngForm
Label= name Name: /label
输入类型= text name= name [(ng model)]= name minlength= 2
=password 密码的标签:/label
需要输入type= password name= password [(ng model)]= password
提交按钮/按钮
!-主要通过hasError方法-
div * ngif= my form . form . haserror( minlength , name )名称的长度不能少于2位数/div。
div * ngif= my form . form . haserror( required , password )密码不能为空/div
/表格响应式表单(重点)
提供对{底层表单对象模型}的底层表单对象模型的直接和显式访问。与模板驱动的表单相比,它们更健壮,可扩展性、可重用性和可测试性更高。此外,更新控件的效率更高,因为FormControl的实例总是返回新值,而不是更新现有的数据模型。如果表单是应用程序的关键部分或者具有很强的可伸缩性,那么就使用响应式表单。
:
使用响应式表单
1.将响应表单模块引入到模块文件中。
从“@angular/forms”导入{ ReactiveFormsModule };2.将表单组引入组件。
从“@angular/forms”导入{ FormGroup,form control };3.创建一个FormGroup实例,并将此FormGroup模型与视图相关联。
this.profileForm=新表单组({
名称:新表单控件(“”),
密码:新表单控件(“”),
});form[form group]= profile form (ngSubmit)= submit form(profile form . value)
=name 名字的标签:/label
输入id= name type= text form control name= name
=password 姓氏的标签:/label
输入id= password type= text form control name= password
提交按钮/按钮
/form
表单嵌套
表单组可以同时接受{单个表单控件实例}单个表单控件实例和其他表单组实例作为其{子控件}子控件。这可以使复杂的表单模型更容易维护,并在逻辑上将它们组合在一起。
1.创建嵌套表单组。
this.profileForm=新表单组({
name: new FormControl( ,[Validators.required]),
密码:新表单控件(“”),
//在表单中嵌套一个表单组地址
地址:新表单组({
街道:新的FormControl(“”),
城市:新的FormControl(“”),
})
});2.在模板中将此嵌套表单分组。
form[form group]= profile form (ngSubmit)= submit form(profile form . value)
=name 名字的标签:/label
输入id= name type= text form control name= name
=密码姓氏的标签:/标签
输入id= password type= text 表单控件名称= password
//使用formGroupName来声明新的表单组
div formGroupName=address
h3地址/h3
=街街的标签:/标签
输入id= street type= text 表单控件名称= street
的标签=cityCity: /label
输入id= city type= text 表单控件名称= city
/div
按钮提交/按钮
/表单
表单验证
控件状态的字段
在学习表单验证之前,我们先来了解一下有角的针对表单所提供的一些{状态字段}状态字段,这些字段可帮助用户决定在那些阶段去做表单验证。
touched 和 untouchedpristine 和 dirtyvalid 和 invalid
控件状态的CSS 类
角度会自动把很多{控件属性}控件属性作为{CSS类}CSS类映射到控件所在的{元素}元素上。你可以使用这些类来{根据表单}根据表单{状态}状态给表单{控件元素}控件元素添加样式。无效。ng-无效。ng-待定。神父。不干净。ng-感动。ng-感动场景:比如我们希望当控件在不满足验证条件的情况下,控件边框显示成红色~实现方式如下:ng-touched:not(form){。ng-invalid:not(form){ //这是半导体色敏传感器的一种写法
边框:1px纯红
}
}
表单验证的步骤
1、在表单组件中导入一个验证器函数,有角度具体提供了那些内置验证器请参照表单验证器官网
从" @angular/forms "导入{验证器};
//有角度提供的内置验证器主要有:最小最大必需的电子邮件最小长度最大长度模式.2、把这个验证器添加到表单中的相应字段。
this.profileForm=新表单组({
name: new FormControl( ,[Validators.required]),
密码:新的FormControl(,[Validators.required,Validators.minLength(4)]),
地址:新表单组({
街道:新的FormControl( ,[Validators.required]),
城市:新的FormControl(" ")。
})
});3、在模板中错误信息的提醒逻辑
form[form group]= profile form (ngSubmit)= submit form(profile form。值)’
!-姓名-
=名称的标签姓名:/标签
输入id= name type= text 表单控件name= name
div [hidden]=profileForm?get(name ).有效 profileForm?get(name )?未触及
p [hidden]=!profileForm.hasError(required , name )名字是必填项/p
/div
!-密码-
=密码的标签密码:/标签
输入id= password type= text 表单控件名称= password
!-先验证密码当密码是合法的或者用户从未操作多的时候,不显示错误信息-
!-然后在根据哈泽罗来判断具体的错误提醒-
div [hidden]=profileForm?get(密码).有效 profileForm?获取(密码)?未触及
p [hidden]=!轮廓形式。有错误(“minlength”、“password”)”密码的位数不能少于四位/p
p [hidden]=!profileForm.hasError(required , password )密码不能为空/p
/div
!-地址表单组-
div formGroupName=address
h3地址/h3
=街街的标签:/标签
输入id= street type= text 表单控件名称= street
div [hidden]=profileForm?获取(地址)?获取(街)?有效 profileForm?获取(地址)?获取(街)?未触及
div [hidden]=!profileForm.hasError(required ,[address , street])街道不能为空/div
/div
的标签=cityCity: /label
输入id= city type= text 表单控件名称= city
/div
按钮提交/按钮
/form
自定义表单验证器
public ngOnInit():void {
this.profileForm=新表单组({
电话:新表单控件(,[this.mobileValidator])
});
}
公共移动验证程序=(控件:表单控件):any={
常量值=控制值
//手规号码正则
const mobileReg=/^0?(13[0-9]15[012356789]17[013678]18[0-9]14[57])[0-9]{8}$/;
常量结果=mobileReg.test(值);
//有效值返回空,无效时返回验证的错误对象,验证对象是名为mobileFormat的验证秘钥属性。值一般可以是任意值
//mobileFormat用于在模板中获取错误信息的时候会被再次使用
返回结果?null : {mobileFormat: {info:手机格式不正确}};
}
//在模板中的使用
form[form group]= profile form (ngSubmit)= submit form(profile form。值)’
输入id= phone type= text 表单控件名称= phone
div{{profileForm?get(phone ).错误 json}}/div //可以将在自定义函数中定义的报错信息打印出来
div [hidden]=profileForm?get(phone ).有效 profileForm?获取(电话)?未触及
p [hidden]=!轮廓形式。有错误(移动格式,电话)手机格式不正确/p
/div
按钮提交/按钮
/表单
如何更新表单数据
使用FormBuilder服务生成控件
表单生成器服务提供了一些{便捷方法}便捷方法来生成表单控件表单生成器在幕后也使用同样的方式来创建和返回这些实例,只是用起来更简单。
1.在组件中引入表单生成器类,并注入服务
从" @angular/forms "导入{表单生成器};
构造函数(私有fb: FormBuilder) { }2 .生成表单内容
这个。侧面形式=这个。FB。组({
名称:[],
密码:[]
});
//等同于
this.profileForm=新表单组({
名称:新表单控件(""),
密码:新表单控件(""),
});
跨字段交叉验证(仅了解)
const hero form=新表单组({
name: new FormControl(),
alterEgo :新的FormControl(),
“电源”:新的表单控件()
},{ validators:identityerevedvalidator });
导出const identityerevaleddvalidator:validator fn=(control:abstract control):验证错误 null={
常量名称=控件。get( name );
const alterEgo=control。get( alterEgo );
返回名称备用名。value===alterEgo。价值?{身份暴露:真}:空;
};更多编程相关知识,请访问:编程视频!以上就是有角的进阶学习之深入了解路由和表单的详细内容,更多请关注我们其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。