(时隔2个多月终于有时间来写博文了)
先总结一下,11月接到一个项目,做到12月然后停工准备考试,到1月才重新开始工作,把一些收尾工作做了,这个项目也是第一次用 Angular Material2 组件,其中还是有一些坑的,就记录一下
这是Angular Material官网
一、安装Angular Material
首先根据官网的指导Get Start
安装Material
坑1: 安装完的 Angular Material,有时候不能 AOT预编译
,这个时候要看依赖包文件,我是用 webpack 这个框架,所以看package.json
就可以看到所有依赖包
可以看到,除了"@angular/material": "^5.0.0-rc0"
为5.0.0之外,还有其他包也要升级,至少要升级到5.0.0
坑2:即使你已经升级到最新版,还有可能不能AOT编译
,当初这个问题搞了我好久,(也不久,就一个晚上),然后就有种直觉是框架的问题,第二天果断换框架,其实也就是升级框架,之前用的是 webpack6
,看了github
发现 webpack
已经有7了,果断换成webpack7
,然后就能 AOT预编译
了
总结:一开始遇到问题是很正常的,这还是第一步,所以第一步不好好解决的话,后面的工作会很难开展的,幸好是项目一开始就发现不能AOT预编译
的问题,不然到后期大改就很麻烦了
二、使用Angular Material
关于怎么使用 Angular Material 官网并没有说明怎么用,一开始我以为引入组件就能用的,其实并不是,看了官网的例子也没有说,之后通过官网在线编辑
,才发现玄机1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33import {
MatAutocompleteModule,
MatButtonModule,
MatButtonToggleModule,
MatCardModule,
MatCheckboxModule,
MatChipsModule,
MatDatepickerModule,
MatDialogModule,
MatExpansionModule,
MatGridListModule,
MatIconModule,
MatInputModule,
MatListModule,
MatMenuModule,
MatNativeDateModule,
MatPaginatorModule,
MatProgressBarModule,
MatProgressSpinnerModule,
MatRadioModule,
MatRippleModule,
MatSelectModule,
MatSidenavModule,
MatSliderModule,
MatSlideToggleModule,
MatSnackBarModule,
MatSortModule,
MatTableModule,
MatTabsModule,
MatToolbarModule,
MatTooltipModule,
MatStepperModule,
} from '@angular/material';
1 | import {CdkTableModule} from '@angular/cdk/table'; |
在官网的在线编辑
的main.ts(或者app.module.ts)
里面,是有以上两段代码的,这就是把所有的material组件作为一个module
,然后再把这个module
放到整个项目内唯一一个AppModule里面,就像官网做的那样
这样就能成功引用组件了
三、常用组件用法
1、button
button是最基础的组件,最常用的就是提交表单的时候,这里用一个验证码的例子来说明button怎么用
这里点击获取验证码
后就disable
使按钮不可点击,然后再根据后端返回值,来进行倒数
倒计时代码如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17//倒计时
countdown = 30;
setTime(obj){
if(this.countdown==0){
this.disablebtn = false;
this.tipstring = "获取验证码";
this.countdown = 30;
return;
}else{
this.disablebtn = true;
this.tipstring = "("+this.countdown+"s)";
this.countdown--;
}
setTimeout(()=>{
this.setTime(obj);
},1000)
}
这样,要一个变量控制是否disable
按钮,然后根据业务逻辑自己调整即可
2、tabs
这里主要讲 tabs的事件怎么用1
2
3
4
5<!-- html -->
<mat-tab-group (selectedTabChange)="select($event)">
<mat-tab label="Tab 1">Content 1</mat-tab>
<mat-tab label="Tab 2">Content 2</mat-tab>
</mat-tab-group>
1 | //ts |
上面的 tabChangeEvent.index
就是你现在选中的tab,根据不同的tab可以做不同的事情
3、snackbar
snackbar 就相当于 Android 的 toast,为了提醒用户一些信息的
snackbar 不难,重点在于它可以复用 ,它有一个属性data
可以用来传值
之后只需要在snackbar组件中就可以用 data
属性了
4、dialog
对话框是一个很重要的交互方式,它可以用于提醒用户信息,也可以用来进行一些输入,这里给出一个复用的例子,用于通知用户一些信息1
2
3
4
5
6
7
8
9<!-- html -->
<h1 mat-dialog-title>{{data.title}}</h1>
<div mat-dialog-content>
<p>{{data.content}}</p>
</div>
<div mat-dialog-actions align="center">
<button *ngIf="data.isOkButton" mat-button (click)="data.OkEvent()" tabindex="2">{{data.OkButtonContent}}</button>
<button *ngIf="data.isNoButton" mat-button (click)="data.NoEvent()" tabindex="1">{{data.NoButtonContent}}</button>
</div>
1 | export class CustomDialogNoticeComponent{ |
这样,就可以在打开这个对话框的时候,传一个 CustomDialogData
的对象,就能根据这些信息配置对话框
5、datepicker
这里主要讲怎么换成中文,因为默认是按照老美那边的标识的,所以要用在我们这边,就需要做一些改动
首先,安装 momentjs
momentjs: JavaScript 日期处理类库
npm install moment --save
然后按照官网的例子1
2
3
4
5
6
7
8
9
10
11
12
13
14
15@Component({
...
providers: [
// The locale would typically be provided on the root module of your application. We do it at
// the component level here, due to limitations of our example generation script.
{ provide: MAT_DATE_LOCALE, useValue: 'zh-cn' },
// `MomentDateAdapter` and `MAT_MOMENT_DATE_FORMATS` can be automatically provided by importing
// `MatMomentDateModule` in your applications root module. We provide it at the component level
// here, due to limitations of our example generation script.
{ provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] },
{ provide: MAT_DATE_FORMATS, useValue: MAT_MOMENT_DATE_FORMATS },
],
})
...
将{ provide: MAT_DATE_LOCALE, useValue: 'zh-cn' },
的useValue
改成'zh-cn
就是中文了,具体时区代号参考
##四、总结
总的来说 Angular Material 组件集成了很多东西,也方便了我们的使用,适合敏捷开发,但是会带来一些依赖性的问题,比如你要为了使用 Angular Material 而改变接口的格式或者和后端的一些对接问题。但是 Angular Material 可以更加复用,我只是很低程度的复用而已