angular第二天学习

作者: 誩先生 | 来源:发表于2020-03-03 19:59 被阅读0次
内容:Angular表单、数据类型、路由、组件通信和网络请求

一、表单

1.引入表单模块

在/src/app/app.module.ts文件中增加表单模块的引入

import { FormsModule } from '@angular/forms'
//挂载到整个项目中
imports: [
  BrowserModule,FormsModule
]

2.使用

在页面组件的ts文件中先定义好变量

在页面组件的html文件中通过ngModel指令来进行数据双向绑定

<input [(ngModel)]="变量名" />

二、数据类型

typescript中增加了数据类型,这样可以保证多人协作开发项目时,可以避免变量定义和赋值时,数据类型不一致的问题。

在组件的类中通过冒号来给变量设置数据类型

1.系统内置类型

name:String//字符串
address:String
phone:Number//数字
isAgree:Boolean//布尔值
firends:[]//数组
hobby:Object//对象

2.自定义数据类型

和class平级的地方通过interface来定义用户自己的数据类型

export class UserInfoComponent implements OnInit {...}
interface 自定义类型名称{
    字段1:数据类型,
    字段2:数据类型,
    ..
}

使用:

export class UserInfoComponent implements OnInit {
    自定义变量名:自定义类型名称
}

三、路由【重点】

1.安装

初始化项目时,选择使用路由

[图片上传失败...(image-8d27df-1583236777255)]

2.使用

第一步:创建几个页面组件

第二步:把app.module.ts中引入的页面组件删除

第三步:在app-routing.module.ts中增加页面组件的引入和路由规则的设置

//加载页面组件
import { HomeComponent } from './home/home.component';
import { LoginComponent } from './login/login.component';
//定义路由规则
const routes: Routes = [
    {
        path:'home',//不用加斜杠
        component:HomeComponent
    },
    {
        path:'login',
        component:LoginComponent
    },
    {
        path:'**',
        redirectTo:'home'
    }
];

注意:在angular中路由规则的path属性不需要写斜杠

​ 重定向,path属性为两个星号,redirect为redirectTo

第四步:在根组件app.componet.html,把原有内容都删除,添加一个路由出口标签

<router-outlet />

3.路由导航

(1)标签导航

在angular中路由导航使用a标签

必要属性:[routerLink]="['/路由规则地址']"

可选属性:routerLinkActive 来给当前选中的a标签设置样式

(2)编程式导航

第一步:引入Router实例

import { Router } from '@angular/router'

第二步:实例化Router

constructor(public router:Router){}

第三步:编写程序代码进行页面跳转

toOrder(){
    this.router.navigate(['/order'])
}

4.路由嵌套

第一步:创建几个页面组件(不要删除app.module.ts中自动生成的代码)

第二步:在路由配置规则文件的一级路由规则中添加children属性,children属性的类型和整体路由规则一样,都是一个数组,在数组中再具体的路由配置规则。

第三步:在一级路由对应的页面组件中,添加<router-outlet></router-outlet>

5.动态路由

第一步:创建页面组件

第二步:定义一个动态路由规则(和vue一模一样)/关键词/:变量名

第三步:在电影列表页面给指定的标签绑定事件,进行参数传递和页面跳转

import { Router } from '@angular/router'
constructor(public router:Router){}
toInfo(id){
    this.router.navigate(['/movieinfo/'+id])//第一种写法
    this.router.navigate(['/movieinfo/',id])//第二种写法
}

第四步:接收动态路由的参数

在电影详情页面组件中的ts文件里进行路由模块的引入

import { ActivatedRoute } from '@angular/router'
id = ''
constructor(public routerInfo:ActivatedRoute){
    this.id = this.routeInfo.snapshot.params.id//第一种获取方式
    this.routeInfo.params.subscribe(res=>{//第二种获取方式
        this.id = res.id
    })
}

另一种传参数的形式:

传参数:

<a [routerLink]="['/order']" [queryParams]="{id:100}">按钮</a>

接收参数:

import { ActivatedRoute } from '@angular/router'
constructor(public routerInfo: ActivatedRoute) {
    this.routerInfo.snapshot.queryParams.id
}

四、组件通信

1.父子组件

第一步:定义一个公用子组件,在不同父组件中使用它

第二步:在父组件使用子组件时,通过自定义属性来传递参数

<子组件名 [自定义变量名]="变量值"></子组件名>

第三步:在子组件中接收父组件传递的参数

引入Input模块

import { Component, OnInit,Input } from '@angular/core';

在子组件的类文件中接收数据

export class MovieItemComponent implements OnInit {
    @Input() data;//接收父组件传递的数据
    constructor() {}
    ngOnInit(): void {
        // console.log(this.data)
    }
}

第四步:在子组件的html文件进行数据的遍历

<div class="list">
    <div class="item" *ngFor="let item of data">
        <img src="{{ item.img }}" alt="">
        <p>{{ item.title }}</p>
    </div>
</div>

2.子父组件

第一步:在父组件中先定义好自定事件和对应的函数,使用子组件时,传递自定义事件

<子组件名 [自定义属性]=“属性值” (自定义事件名)="自定义函数($event)"

第二步:在子组件中通过output和eventEmmiter来触发父组件的自定义事件

import { Component, OnInit,Input,Output,EventEmitter } from '@angular/core';
export class MovieItemComponent implements OnInit {
    @Input() data;//接收父组件传递的数据
    @Output() delByItem:EventEmitter<Number> = new EventEmitter();
    delItem(m){
        this.delByItem.emit(m);
    }
    constructor() {}
    ngOnInit(): void {
        // console.log(this.data)
    }
}

第三步:在父组件的自定义事件函数中执行数据的操作

del(n){
   var idx = this.movies.findIndex(d=>{
        return d.id === n
   });
   this.movies.splice(idx,1)
}

3.服务

(1)创建服务

ng generate service [服务目录/]服务名称

可以简写成

ng g s [服务目录/]服务名称

(2)定义数据和方法

服务是一个类,就可以在类中定义属性和方法

export class UserService {
    name = 'admin'
    setName(name){
        this.name = name
    }
    constructor() { }
}

(3)在普通的组件中使用

在普通组件的ts文件中引入创建好的服务

import {UserService} from '../../services/user.service'

在普通组件的html文件中使用服务中定义好的属性和方法

<div class="header">
    <h3>XXX后台管理系统</h3>
    <p>欢迎:{{ userService.name }}</p>
    <button (click)="userService.setName('小明')">点我改变</button>
</div>

五、网络请求

1.配置代理

在项目根目录创建一个json文件,名字自己设置

此文件中的内容和vue的proxyTable属性中的内容一样

{
    "/api":{
        "target":"http://localhost:3000"
    }
}

在package.json文件中的start选项中使用创建好的代理文件

"start": "ng serve --proxy-config proxy.config.json"

重启项目,npm start

此时如果再使用ng serve来启动项目,则不会使用代理。

2.引入http模块

app.module.ts中引入httpClientModule

import { HttpClientModule } from '@angular/common/http'
imports: [//项目需要使用模块依赖
    BrowserModule,
    AppRoutingModule,
    HttpClientModule
  ]

在需要使用网络请求的页面组件中引入httpClient模块

import { HttpClient } from '@angular/common/http'
constructor(public http : HttpClient) { }

3.发起网络请求

get

this.http.get('请求地址').subscribe(res=>{
    console.log(res)
})

post

this.http.post('请求地址',要提交的数据).subscribe(res=>{
    console.log(res)
})

相关文章

网友评论

    本文标题:angular第二天学习

    本文链接:https://www.haomeiwen.com/subject/otcllhtx.html