angular第二天学习

内容: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)
})
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容