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