美文网首页
Angular学习笔记

Angular学习笔记

作者: lazy_tomato | 来源:发表于2020-06-20 14:54 被阅读0次

1.angular介绍

  • 谷歌开发的开源的web框架,诞生于2009年
  • angular基于Typescript
  • 它和react,vue相比,angular更适合中大型企业项目
  • 截止2019/12/25 angular最新版本为angular9.X。根据官方介绍,angular每过几个月就会更新一个版本,angular2.X以后的所有的angular版本用法都是一样的。

2.学习angular必备基础

  • html css js(es6)
  • 有ts基础更好,没有ts基础那就要学了

3.angular环境搭建

必备nodejs(npm)

安装脚手架

npm install -g @angular/cli
//全局安装,随便哪里打开终端即可

创建工作空间

ng new my-app
突然报错
ng : 无法加载文件 C:\Users\SWQ\AppData\Roaming\npm\ng.ps1,因为在此系统上禁止 运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135170  中的 about_Execution_Policies。
解决方法(管理员身份打开powerShell)

自行百度

运行项目

cd my-app
ng serve --open

安装的时候会提示1.是否安装路由,2.安装什么样式预处理,3.是否数据共享(后期很熟练了我在补充这个地方)

4.文件目录结构

xxx

5.创建组件

1.创建命令行形式创建

ng g component components/new
//简写 ng g c components/new
//components/new 这个是我们想创建的文件路径以及文件名
// 命令行形式的创建组件,组件会自动的在aap.module.ts被引入和注册

2.使用

根据组件文件夹中 组件名.components.ts =》@Component=》selector 的名称,和vue

类似,直接标签形式使用即可

3.组件中定义数据

组件的ts文件中
export class FooterComponent implements OnInit {
 //这就是我自己定义的数据title
 //不写也可以 默认就是pubilc
  public title="我是一个footer组件的数据";
 //ts中定义数据,建议定义类型,怎么玩? any(任意类型)
  username:string='潇洒哥'; 
  public student:any=['qwe'];
  public arr2:Array<number>=[1,2,3,4,5]; //定义一个数组,并限制数组每一项的类型
  constructor() { }

  ngOnInit(): void {
  }

}
组件的html文件中
{{title}} {{username}}
//直接用即可
声明属性的几种方式:
  1. public 共有 可以在这个类中使用,也可以在这个类外面使用

  2. protexted 保护类型 只能在这个类中,或者它的子类中使用

  3. private 私有 只能这个类中使用

  4. 千万别习惯性的用var 去定义

6.Angular常用的指令

  • 组件绑定数据(和vue中v-bind类似)
<div [title]="say">
    鼠标放上去会有什么效果呢
</div>
<!-- 用[] say是我组件中的数据 -->
  • 如果数据是一个html字符串怎么处理(和vue-html类似) 默认不处理原样输出

    com:string='<h1>这是我自己html字符串</h1>';
    
    <div >
       <span [innerHTML]='com'></span> 
    </div>
    
    
  • {{中间允许简单的计算}}

    1+2={{1+2}}
    
  • 循环数据 *ngFor

    <ul>
      <li *ngFor="let item of list;let key=index;">
        {{item.title}} 索引为{{key}}
      </li>
    </ul>
    
  • 引入图片

    <!-- 引入本地图片 -->
    <img src="assets/images/jiaoben.png" alt="1">
    
    <!-- 引入网络上的图片 -->
    <img [src]="pirUrl" alt="2">
    
  • *ngif

    <!-- *ngif -->
    <h1>条件判断语句 *ngif</h1>
    <div *ngIf="flag">
      <img src="assets/images/sc.png" alt="">
    </div>
    
    <div *ngIf="!flag">
      <img src="assets/images/sc_a.png" alt="">
    </div>
    
  • ngSwitch

    <!-- ngSwitch -->
    
    <div [ngSwitch]="orderStatus">
        <div *ngSwitchCase="1">已经支付</div>
        <div *ngSwitchCase="2">已经发货</div>
        <div *ngSwitchCase="3">已经收货</div>
        <div *ngSwitchCase="4">已经退货</div>
        <div *ngSwitchDefault>无效</div>
    </div>
    
  • ngClass

    .red{
        color: red;
    }
    
    .big{
        font-size: 48px;
    }
    
    <div [ngClass]="{'red': flag,'big':!flag}">
      ngClass指令
    </div>
    
  • ngStyle

    <!-- ngStyle -->
    <div [ngStyle]="{'color': 'blue'}">
      ngStyle的使用
    </div>
    
  • 绑定事件

    <!-- 绑定事件 事件后面的括号我省略了没反应 那就写吧-->
    <h3 (click)='toSay()'>点我触发事件</h3>
    
    <h3 (click)='toSay2()'>点我改变上面星星的颜色</h3>
    
    // 就在ngOnInit后面写自己的方法即可,不需要加,因为我们是ts
      toSay(){
      alert('事件绑定成功')
      }
    
      toSay2(){
       this.flag=!this.flag
      }
    
  • 表单事件 事件对象

    <!-- 表单事件 事件对象 -->
    <!-- <input type="text" (keydown)='down()'> -->
    
    <input type="text" (keydown)='down($event)'>
    
down(e) {
    // 按了回车接受输入框中的值
    console.log(e.target)
    if (e.keyCode == 13) {
      console.log(e.target.value)
    }
  }

  • 双向数据绑定

    • //app.module.ts 引入
      import {FormsModule} from '@angular/forms'
      //在 @NgModule 中的 imports 注册 FormsModule
      
    • <h1>双向数据绑定 只针对表单</h1>
      <!-- 双向数据绑定 MVVM视图改变数据改变,数据改变视图改变 只针对表单-->
      <input type="text" [(ngModel)]="keywords"> {{keywords}}
      <button (click)='changeKeywords()'>改变左边的的值</button>
      
    •  public keywords:string='默认值'
       changeKeywords(){
          this.keywords='变化后的值'
        }
      

7.Angular中的服务

  • 组件的方法 不能互相调用
  • 有公共的方法,可以放在service(服务)中

创建服务

  • // 1.创建服务
    ng g service services/storage
    
  • // 2.app.module.ts 引入并配置服务
    import {StorageService} from './services/storage.service'
    
    //在 @NgModule 中的 providers 注册 StorageService
    
  • // 3.组件的.ts文件中 引入
    import {StorageService} from '../../services/storage.service'
    
  •  //4. 组件的.ts文件中 使用
     constructor(public storage: StorageService) {
        console.log(storage.swq())
      }
    

8.Angular 中的DOM操作

  • 方法一 通过DOM操作

    import { Component, OnInit } from '@angular/core';
    
    @Component({
      selector: 'app-home',
      templateUrl: './home.component.html',
      styleUrls: ['./home.component.less']
    })
    export class HomeComponent implements OnInit {
    
      public flag: any = true
    
      constructor() { }
    
      ngOnInit(): void {
        // ngOnInit 组件和指令初始化完成时的钩子函数
    
        // angular 动画效果 实现 
    
        // 方法一 通过DOM操作
        let dv = document.getElementById('dv')
        dv.style.color = 'red'
        console.log(dv.innerHTML)
    
    
        //获取不到DOM节点 因为我们是ng去控制的
        /*  let dv2:any =document.getElementById('dv2')
         dv2.style.color='red'
         console.log(dv2.innerHTML) */
    
      }
    
      //  视图加载完成以后 dom加载完成(建议吧都DOM操作放在这里)
      ngAfterViewInit(): void {
        let dv2:any =document.getElementById('dv2')
        dv2.style.color='red'
        console.log(dv2.innerHTML)
    
      }
    
    }
    
  • 方法二 通过ViewChild操作
import { Component, OnInit,ViewChild,ElementRef } from '@angular/core';

@Component({
  selector: 'app-news',
  templateUrl: './news.component.html',
  styleUrls: ['./news.component.less']
})
export class NewsComponent implements OnInit {

  //获取DOM节点
  @ViewChild('MyBox') ElementRef:any

  constructor() { }

  ngOnInit(): void {
  }

  ngAfterViewInit(): void {
 
  console.log(this.ElementRef.nativeElement.innerHTML)

  this.ElementRef.nativeElement.style.width='100px'
  this.ElementRef.nativeElement.style.color="yellow"
  }

}

@ViewChild总结

  • 总结 利用 @ViewChild 获取DOM节点

    • html中给DOM起个名字

      <div #MyBox>
          我是new
      </div>
      
    • 在业务逻辑中引入

      import { Component, OnInit,ViewChild,ElementRef } from '@angular/core';
      
    • 在类里面写

       @ViewChild('MyBox') ElementRef:any
      
    • 使用

      this.ElementRef
      
  • 总结利用@ViewChild 获取子组件并调用子组件的方法

    • 引入组件

      <app-header #hs></app-header>
      
    • 引入ViewChild

      import { Component, OnInit,ViewChild,ElementRef } from '@angular/core';
      
    • 获取到子组件

        //获取子组件
        @ViewChild('hs') hs:any
      
    • 使用this 调用对应的组件实例

         this.hs.say_yan()
      

9.Angular父子组件的通信

  • 父传子

    • 父组件的html中使用子组件,直接绑定属性

      <app-header [smsg]="msg"></app-header>
      
    • 子组件引入input模块

      import { Component, OnInit, Input } from '@angular/core';
      
      
    • 子组件类中接受变量

      // 接受父组件传来的数据
        @Input() smsg: string;
      
      
    • 子组件使用父组件的数据

      <div>
          我是子组件
          <p>{{smsg}}</p>
      </div>
      
      

    总结:父传子,上述方法,可以 (1)传递变量,(2) 传递数据,也可以 (3) 直接传递this,将父组件传递给子组件.

  • 子传父

    • 利用上面写的 @ViewChild,可以实现 父组件获取子组件数据
  • 非父子组件

    • Service

    • localStorage

相关文章

  • Angular4 组件通讯方法及DOM的操作使用

    简介 由于angular版本更新频繁,导致学习起来特别费劲,下面是在学习 Angular 过程中整理的学习笔记,希...

  • spark_learn

    Angular2学习笔记——NgModule es6 新增的map和foreach AngularJS2.0 学习...

  • Angular学习笔记

    生成项目 用stylus的时候写成下面这样,这个坑搞了我2天 创建带路由的项目 获取dom 不建议直接对dom进行...

  • angular学习笔记

    1.ng-app=""; 指令初始化一个 AngularJS 应用程序,定义AngularJS的使用范围; 2.n...

  • Angular学习笔记

    angular是面向未来的前端开发框架,学习她理解思想比代码重要,体现的是跨越前后端、大成、优秀的编程思想。她是一...

  • Angular学习笔记

    Angular 1.创建模块: var oneApp = angular.module("myApp",[ ] )...

  • angular学习笔记

    一、搭建Angular开发环境 安装nodejs, Angular Cli, WebStorm 先安装nodejs...

  • Angular 学习笔记

    几个常用命令 npm + ng npm i --save 包名:软件依赖 npm i --save-dev 包名...

  • Angular学习笔记

    为何需要MVC 代码规模越来越大,切分是大势所趋 为了复用:逻辑,用法一样的模块 后期维护方便:修改一块功能不影响...

  • angular学习笔记

    Angular:框架: 对程序员的限制高库: jquery,bootstrap —— 使用灵活,对程序员的限制少...

网友评论

      本文标题:Angular学习笔记

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