新建路由页面

  1. // ①在app-routing.module.ts中引入并注入到routes中:
  2. import {GoodsManageComponent} from './goods-manage/goods-manage.component';
  3. const routes: Routes = [
  4. ...
  5. {path: 'goods-manage', component: GoodsManageComponent} // goods-manage页面
  6. ];
  7. // ②浏览器中输入:xxxx/#/goods-manage

子组件和父组件传值

  1. // 先引入
  2. import { Component, Input, Output, EventEmitter } from '@angular/core';
  3. // 子组件:
  4. // html文件:
  5. <div class="item" (click)="onSonMethod(info)"></div>
  6. // ts文件:
  7. @Input() sonShuXing:string='这是子属性';
  8. @Output() sonMethod = new EventEmitter<any>()
  9. onSonMethod(info) {
  10. this.sonMethod.emit(info)
  11. }
  12. // 父组件:
  13. // html文件:
  14. <app-son [sonShuXing]='接收子属性' (sonMethod)='fatherMethod($event)'><app-son>
  15. // ts文件:
  16. fatherMethod(info) {
  17. console.log(info)
  18. }

路由跳转以及传参

  1. // ① 跳转传参:
  2. import { Router } from '@angular/router';
  3. constructor( private router: Router /** 路由跳转 */ ) { }
  4. // 跳转
  5. onEditItem(data): void {
  6. this.router.navigate(['/group-edit'], {
  7. queryParams: {
  8. id: data.id
  9. }
  10. });
  11. }
  12. // ② 接收:
  13. import { ActivatedRoute } from '@angular/router';
  14. constructor( public activeRoute: ActivatedRoute ) { }
  15. // 接收值
  16. ngOnInit() {
  17. this.activeRoute.queryParams.subscribe(params => {
  18. this.groupId = params.id;
  19. console.log(this.groupId);
  20. });
  21. }

管道

日期管道

  1. // ①ts中使用
  2. import { DatePipe } from '@angular/common';
  3. constructor( private datePipe: DatePipe ) { };
  4. dateTime = this.datePipe.transform(this.upTimeChild.date, 'yyyy-MM-dd HH:mm:ss'),
  5. // ②html中使用
  6. {{ data.createTime | date:'yyyy-MM-dd HH:mm:ss' }}

自定义管道

自定义管道没必要在ts中使用,管道归根到底就是一个方法,写到utils就好了。

  1. // 命令:ng g p pipe/test-pipe/test-pipe
  2. // 生成后会自动注入到根的app.module.ts中,但是一般会选择集成,
  3. // pp.module.ts
  4. import { PipePipe } from './pipe/test-pipe/test-pipe';
  5. @NgModule({
  6. declarations: [
  7. ...
  8. PipePipe
  9. ],
  10. imports: [...],
  11. providers: [...],
  12. bootstrap: [AppComponent]
  13. })
  14. // test-pipe.pipe.ts
  15. @Pipe({
  16. name: 'testPipe' // 使用的pipe名称
  17. })
  18. transform(value: boolean): any {
  19. // 你想要做的处理。参数value就是需要做管道处理的数据
  20. }
  21. // html中使用
  22. <div>{{ someData | testPipe }}</div>

Directive指令

内置指令

属性指令[ngClass]/[ngStyle]、内置结构指令ngIf/ngFor 、[ngSwitch]ngSwitchCasengSwitchDefault等…

  1. <!-- 如 -->
  2. import { Component } from '@angular/core';
  3. @Component({
  4. selector: 'ngstyle-example',
  5. template: `
  6. <ul *ngFor="let person of people">
  7. <li [ngStyle]="{'color': getColor(person.country)}">
  8. {{ person.name }} ({{person.country}})
  9. </li>
  10. </ul>
  11. `
  12. /*
  13. * 等同于
  14. * <ul *ngFor="let person of people">
  15. * <li [style.color]="getColor(person.country)">
  16. * {{ person.name }} ({{person.country}})
  17. * </li>
  18. * </ul>
  19. */
  20. })
  21. export class NgStyleExampleComponent {
  22. getColor(country: string) {
  23. switch (country) {
  24. case 'CN':
  25. return 'red';
  26. case 'USA':
  27. return 'blue';
  28. case 'UK':
  29. return 'green';
  30. }
  31. }
  32. people: any[] = [
  33. {
  34. name: "Semlinker",
  35. country: 'CN'
  36. },
  37. {
  38. name: "Donald John Trump",
  39. country: 'USA'
  40. },
  41. {
  42. name: "Daniel Manson",
  43. country: 'UK'
  44. }
  45. ];
  46. }

自定义属性指令

1、指令实现

  1. import {Directive, Input, ElementRef, Renderer, HostListener} from "@angular/core";
  2. @Directive({
  3. selector: '[exeBackground]'
  4. })
  5. export class ExeBackgroundDirective {
  6. private _defaultColor = 'yellow';
  7. @Input('exeBackground')
  8. backgroundColor: string; // 输入属性,用于设置元素的背景颜色
  9. constructor(private elementRef: ElementRef, private renderer: Renderer) {
  10. this.setStyle(this._defaultColor);
  11. }
  12. @HostListener('click') // 这里对应DOM的原生方法
  13. onClick() { // 监听宿主元素的点击事件,设置元素背景色
  14. this.setStyle(this.backgroundColor || this._defaultColor);
  15. }
  16. private setStyle(color: string) { // 调用renderer对象提供的API设置元素的背景颜色
  17. this.renderer.setElementStyle(this.elementRef.nativeElement,
  18. 'backgroundColor', color);
  19. }
  20. }

2、指令应用

  1. import { Component } from '@angular/core';
  2. @Component({
  3. selector: 'my-app',
  4. template: `<h1 [exeBackground]="'red'">Hello {{name}}</h1>`,
  5. })
  6. export class AppComponent {
  7. name = 'Angular';
  8. }

自定义结构指令

1、指令实现

  1. import {
  2. Directive,
  3. Input,
  4. TemplateRef, // 用于表示内嵌的 template 模板元素,通过 TemplateRef 实例,我们可以方便创建内嵌视图(Embedded Views),且可以轻松地访问到通过 ElementRef 封装后的 nativeElement。
  5. ViewContainerRef // 主要作用是创建和管理内嵌视图或组件视图。
  6. } from '@angular/core';
  7. @Directive({
  8. selector: '[exeUnless]'
  9. })
  10. export class UnlessDirective {
  11. @Input('exeUnless')
  12. set condition(newCondition: boolean) {
  13. if (!newCondition) { // 创建模板对应的内嵌视图
  14. this.viewContainer.createEmbeddedView(this.templateRef);
  15. } else {
  16. this.viewContainer.clear();
  17. }
  18. }
  19. constructor(private templateRef: TemplateRef<any>,
  20. private viewContainer: ViewContainerRef) {
  21. }
  22. }

2.指令应用

  1. import { Component } from '@angular/core';
  2. @Component({
  3. selector: 'my-app',
  4. template: `<h1 [exeBackground]="'red'" *exeUnless="condition">Hello {{name}}</h1>`,
  5. })
  6. export class AppComponent {
  7. name = 'Angular';
  8. condition: boolean = false;
  9. }

loadChildren路由懒加载

1、首先创建需要懒加载的路由模块

  1. //在命令行输入: ng g module loadChild/ --routing=true
  2. /** 该语句会在根目录生成loadChild文件夹;
  3. * 并在该文件夹下生成load-child-routing.module.ts与load-child.module.ts两个文件;
  4. * 其中load-child.module.ts是需要懒加载页面指向的module;
  5. * 而load-child-routing.module.ts里面包含具体懒加载的页面。
  6. */
  7. // 在load-child.module.ts你会看到:
  8. import { NgModule } from '@angular/core';
  9. import { LoadChildRoutingModule } from './load-child-routing.module';
  10. @NgModule({
  11. declarations: [],
  12. imports: [
  13. LoadChildRoutingModule
  14. ]
  15. })
  16. export class LoadChildModule { }

2、然后创建需要懒加载的页面

  1. // 在命令行输入: ng g c loadChild/child
  2. // 然后会在loadChild文件夹下生成child文件夹,该文件夹包含该路由页面的html、ts、css以及测试文件
  3. // 生成之后,该组件会自动被加入到load-child.module.ts中,所以此时你会看到
  4. import { NgModule } from '@angular/core';
  5. import { LoadChildRoutingModule } from './load-child-routing.module';
  6. import { ChildComponent } from './child/child.component';
  7. @NgModule({
  8. declarations: [ChildComponent],
  9. imports: [
  10. LoadChildRoutingModule
  11. ]
  12. })
  13. export class LoadChildModule { } /** 这个名称就是要注入的懒加载名称,在loadChildren的路径后面以#注入 8?

3、定义跳转的地址

  1. // load-child-routing.module.ts
  2. import { NgModule } from '@angular/core';
  3. import { Routes, RouterModule } from '@angular/router';
  4. import { ChildComponent } from "./child/child.component";
  5. const routes: Routes = [
  6. {
  7. path: 'loadChild', component: ChildComponent, // path的值随便你定,就是要跳转的地址
  8. }
  9. ];
  10. @NgModule( {
  11. imports: [ RouterModule.forChild( routes ) ],
  12. exports: [ RouterModule ]
  13. } )
  14. export class LoadChildRoutingModule { }

4、注入懒加载行为

  1. // 如我想在todolist下做路由懒加载,就在todolist的loadChildren后面注入
  2. /** app-routing.module.ts
  3. */
  4. import { NgModule } from '@angular/core';
  5. import { Routes, RouterModule } from '@angular/router';
  6. import { TodoListComponent } from './pages/todo-list/todo-list.component';
  7. const routes: Routes = [
  8. { path: 'todolist', component: TodoListComponent },
  9. /** 注意:
  10. * 当相同的路由下有不同的懒加载模块的时候,
  11. * 其不同的懒加载模块里装载的路由页面不能一致,否则重复的路由页面报错无法跳转
  12. */
  13. {
  14. path: 'todolist',
  15. loadChildren:'./loadChild/load-child.module#LoadChildModule' // 注入,注意#后面的就是当前注入路径的ts文件中的名称
  16. /** 如果这里的懒加载模块'./loadChild/load-child.module#LoadChildModule'有一个路由页面ChildComponent,
  17. * 然后下面的'./loadChild/load-child.module#LoadChildModule'有一个相同的路由页面ChildComponent,
  18. * 此时第二个相同的路由页面就会报错。
  19. * {
  20. * path: 'todolist',
  21. * loadChildren:'./loadChild/load-child.module#LoadChildModule'
  22. * },
  23. */
  24. },
  25. ]
  26. @NgModule( {
  27. imports: [ RouterModule.forRoot( routes ) ],
  28. exports: [ RouterModule ]
  29. } )
  30. export class AppRoutingModule { }


5、路由跳转**

  1. // todo-list.component.html
  2. <a routerLink='loadChild' class="a">从todolist页面跳转到loadChild页面</a>
  3. /** 点击这个路径之后,就会跳转到 /todolist/loadChild 这个页面;
  4. * 注意,如果在其他页面跳转到该loadchild页面,路径为完整的 /todolist/loadChild
  5. */