Angular 基础记录

Posted 望着天的蜗牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Angular 基础记录相关的知识,希望对你有一定的参考价值。

                                         Angular  基础

1.安装angular的脚手架(安装 过的可以忽略 )

npm install -g @angular/cli

如果提示 :无法加载文件 C:\\Users\\Administrator\\AppData\\Roaming\\npm\\ng.ps1,因为在此系统上禁止运行脚本 则以管理员身份执行 Windows PowerShell, 执行以下指令

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

2.创建angular项目

 ng new 项目名(下图为目录结构说明 )

 

 

 

 

注意 :由于国内安装 有些包可能会失败所以可以按以下方法添加 taobao的包源,来安装项目依赖包

执行以下的 就会有cnpm(注册 cnpm 的包源)

npm install -g cnpm --registry=https://registry.npm.taobao.org

 

创建项目时跳过 npm install(后面项目创建好可以手动执行), 这个是安装所需要包的命令所以一定会需要 .跳过是因为可以选择cnpm(淘宝的,要装个东西才有这命令) 命令来使用国内的源安装

ng new xxx --skip-install      

 

启动项目    ng serve

启动后打开浏览器     ng serve –open

默认启动端口是4200 如果要指定可以用下面的命令

ng server --port 4100

 

注意 (如果没有使用可以忽略,因为不是所有功能都用到它.如果页面加载慢可以看一下网络监控是不是加载不到资源导致的):  由于angular使用了google字体库,路径https://fonts.googleapis.com  ,在国内访问不到.如果环境可以使用网络则可以在项目中搜索把该路径替换为 https://fonts.font.im ,这个路径是中国站的地址 ,主网站为  http://googlefonts.cn/   , 但如果不能访问外网则需要下载字体本地包然后修改引用.

 

 

 

3. 创建组件 (就是页面显示的内容,组件默认创建在 app目录下 )

ng g (这是创建命令,具体的指令 可以 运行该指令后看内容提示) 

ngOnInit  方法是在页面刷新时触发 一次(只代表组件和指令初始化完.不代码页面dom加载 完成如不含指令的元素在这里可以获取到但含指令的就获取不到了)

ngAfterViewInit  视图加截完成,dom在这里就一定完成了

 

4. 数据绑定 (绑定中如果值不用引号则表示是使用的声明的属性,vue类似)

  [title]=”’aaa’+dd” 则表名字符串 aaa+一个定义的属性 dd, 在定义属性,变量时最后指定类型(防止引用有些组件不支持不指定类型的方式 引起未知问题)

   定义数据在当前组件的  组件名.component.ts   ,如下图定义一个xxx属性.指定为string类型

constructor  是这个组件的构造函数

属性不加访问修饰符默认为 public 它的修改符有 共有,私有,被保护3

 

 

 

 

   在标签内绑定数据可以直接用{{xxx}} <div>{{xxx}}</div>

   在标签属性上绑定数据 则属性要用[] 括起来 如 <div [title]="xxx"></div>

   当在标签里显示html内容则需要给标签的innerHTML赋值(否则则按标签原样输出代码) <div [innerHTML]="xxx"></div>

 

5 . 指令(同个元素上不能写多个指令与版本有关):

   *ngFor   <li *ngFor=”let item of arr”></li>,如果要获取索引则

<li *ngFor="let item of items; let i=index"></li>

 

 

Vscode中可安装  Angular  N Snippets  在编码时就会有提示(N是版本号) 如下图

 

 

 

 

   条件判断 *ngIf

 

 

 

   *ngSwitch

 

 

 

样式绑定

      [ngClass]=”{‘类名’:true,….}”

      [ngStyle]=”{‘color’:’red’}”

      [hidden] 隐藏显示某个内容

管道(也可以自定义) :

       时间定义 ( | date :’格式’)

         {{时间对象 | date:’yyyy-MM-dd’}}

6.  事件绑定用小括号括起来

   (click)=”sss()” 定义sss方法如下,方法也能传入eventvue一样 sss($event)

 

 

 

事件绑定时也可以写表达式

 

 

 

7. 双向数据绑定

双向绑定只在form中才有效在使用之前需要先引用form组件

 

 

 

应用:

<input [(ngModel)]="name"/>

 

8.数据缓存(服务的应用,angular中组件中无法相互访问,服务 大家都 可以方法)

  注意 :  这里说的无法相互访问是原则上的.如果你把一个组件也注册到服务里依然是可以访问的.但很不建议这样做 ,这个访问规则也是这样只是原则上不能相互调

组件与组件不能相互调用(父子组件可以相互操作) ,组件可以调服务 ,服务不能调组件 , 服务间可以相互调用

  1. 创建服务 默认在app目录下

                            ng g service 服务名(路径) 

                             sss目录下创建一个sms服务 ng g service sss/sms  

      添加服务后也需要在下面的文件里添加 引用.并注册在箭头的位置,注册后在其它组件中使用依然需要按下面引用的方法一样引用一次 ,才能使用(如下第二图)

 

 

 

 

 

 

 

 

 

9. angular中的DOM操作

  1. 原生方法操作,按第三点说的操作dom元素应该在ngAfterViewInit 方法中进行.

      2. 使用angular中的dom操作类ViewChild

1. dom对象起个名字用 #  如

<div #dnd>

    

</div>

                            2. 在引用里引用viewChild,然后通装饰器来获取如下图,注意这里依然建议在ngAfterViewInit去使用dom对象

 

 

 

         3. viewChild也可以直接获取出一个子组件和上面操作一致.通过装饰器取出来的就直接是子组件对象(区别上面获取原生dom 是在对象的nativeElement 属性上)

 

9. 父子组件 组件间的通讯

      1. 父组件传值给子组件 @input,原则上任何内容都能传 ,父组件自己,方法,属性,对象 等

        给子组件上绑定一个属性,并在子组件中引用Input ,通过Input装饰器来接收值,注意接受的变量名与写在父组件中接收的属性名一致.如下面的tstn , 这里要注意接收值的类型用any(目前 我使用的版本 any以外的编译报错,说未初始化属性,给个初始值后是可以正常接收父组件传来的数据),使用时像用自己的属性一样通过 this.tstn调用 即可

     

 

 

 

2. 父中获取子组件的数据 (参考第9.中的 ViewChild)

3. 通过 Output进行父子交互

      1. 像引用input一样添加 Output  EventEmitter 的引用

      2. 子组件中实例化EventEmitter

      3. 子通过调用 EventEmitter实例 emit方法向父递交数据

      4. 父在子组件标签上添加方法来接收子传传的数据 (绑定的属性要和子里实例化的EventEmitter的属性名一致)

 

 

 

4. 没有关系 的组件中数据交换 .一般使用 服务 或 localStorage

 

10. 生命周期 (https://angular.cn/guide/lifecycle-hooks)

           以下按顺序执行,Init的加载时触发一次, Check的数据发生变化时就会触发一次(顺序1, 5,7,3),如果有父子传子的变更ngOnChanges 也会被触发

 

 

1

 

 

 

ngOnChanges()

当 Angular 设置或重新设置数据绑定的输入属性时响应。 该方法接受当前和上一属性值的 SimpleChanges 对象

注意,这发生的非常频繁,所以你在这里执行的任何操作都会显著影响性能。 欲知详情,参阅本文档的使用变更检测钩子

有父子传值时它才触发

在 ngOnInit() 之前以及所绑定的一个或多个输入属性的值发生变化时都会调用。

注意,如果你的组件没有输入,或者你使用它时没有提供任何输入,那么框架就不会调用 ngOnChanges()。

 

 

2

 

 

 

ngOnInit()

在 Angular 第一次显示数据绑定和设置指令/组件的输入属性之后,初始化指令/组件。 欲知详情,参阅本文档中的初始化组件或指令

在第一轮 ngOnChanges() 完成之后调用,只调用一次。

 

 

3

 

 

 

ngDoCheck()

检测,并在发生 Angular 无法或不愿意自己检测的变化时作出反应。 欲知详情和范例,参阅本文档中的自定义变更检测

紧跟在每次执行变更检测时的 ngOnChanges() 和 首次执行变更检测时的 ngOnInit() 后调用。

 

 

4

 

 

 

ngAfterContentInit()

当 Angular 把外部内容投影进组件视图或指令所在的视图之后调用。

欲知详情和范例,参阅本文档中的响应内容中的变更

第一次 ngDoCheck() 之后调用,只调用一次。

 

 

5

 

 

 

ngAfterContentChecked()

每当 Angular 检查完被投影到组件或指令中的内容之后调用。

欲知详情和范例,参阅本文档中的响应被投影内容的变更

ngAfterContentInit() 和每次 ngDoCheck() 之后调用

 

 

6

 

 

 

ngAfterViewInit()

当 Angular 初始化完组件视图及其子视图或包含该指令的视图之后调用。

欲知详情和范例,参阅本文档中的响应视图变更

第一次 ngAfterContentChecked() 之后调用,只调用一次。

 

 

7

 

 

 

ngAfterViewChecked()

每当 Angular 做完组件视图和子视图或包含该指令的视图的变更检测之后调用。

ngAfterViewInit() 和每次 ngAfterContentChecked() 之后调用。

 

 

8

 

 

 

ngOnDestroy()

每当 Angular 每次销毁指令/组件之前调用并清扫。 在这儿反订阅可观察对象和分离事件处理器,以防内存泄漏。 欲知详情,参阅本文档中的在实例销毁时进行清理

在 Angular 销毁指令或组件之前立即调用。

11.  Angular中异步操作 Rxjs

     添加引用

import {Observable} from \'rxjs\'

如果需要使用工具还需要添加(mapfilter 两个工具举例)

import {map,filter} from \'rxjs/operators\'

使用如下

 

 

 

 

12.  与后台交互处理

          1. get/post 请求  angular5 以后都 是使用HttpClientModule模块来实现的

          2. 先引用HttpClientModule并注入到angular

  

 

 

     3. 在需要使用的地方引用HttpClient,并在构造函数中注入(声明)

   

 

 

      4. 如果需要跨域 可以使用本地代理实现   https://blog.csdn.net/changerjjlee/article/details/103833842

     5.  也可以配置响应头

 

 <add name="Access-Control-Allow-Origin" value="这里设置具体地址如 http://localhost:4200/" />

        <add name="Access-Control-Allow-Credentials" value="true" />    

        <add name="Access-Control-Allow-Methods" value="GET,POST" />

         <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept, Authorization" />

13. 路由

  1. 在创建项目时选择添加 路由

  2.生成的项目中会多一个路径配置文件app-routing.module ,并在app.module 中注册路由模块

              3. 路径配置,先引用组件,然后再做如下配置,path:”**”时表示其它都未匹配到时选择的路由规则,这时可以设置

//没有匹配到其它路由则跳转到home

{path:\'**\',redirectTo:\'home\'}

//下面的也可以

{path:\'\',redirectTo:\'/home\',pathMatch:\'full\'}

 

 

 

 

 

   4 . 使用时可以 http://根路径 /home 也可以在标签上写 routerLink 来实现 , routerLinkActive 表示如果当前是自己这个路径则添加 active的样式(active这里是指样式 名自己可以定义)

<a routerLink="/home" routerLinkActive=’active’></a>

5. 路径动态传值 (注意 routerlink 加中括号后面则跟一个表达式.不加则像上面一个跟一个字符串),

          Get 传值

<a [routerLink]="[ \'/path\' ]" [queryParams]="{xx:2}"  routerLinkActive="active">name</a>

 

要在组件里获取到传的值 .则需要添加 对router的引用如下

 

 

 

 

     动态路径传值

    路由配制改为:  {path:\'home/:xx\',component:HomeComponent},

:xx 占位,表示这里有个参数名字叫xx,然后通过下面的方式 就会把nn传给xx 生成地址为 home/nn

    <a [routerLink]="[ \'/home\',\'nn\' ]" routerLinkActive="active">kkk</a>

组件内取值是和get取值 差不多只是属性不一样

 this.r.params.subscribe(c=>{

      

    })

  

 

6.  js代码跳转

动态路由的跳转

 需要引用Router,在构造函数中注入后直接用router进行跳转

import {  Router } from \'@angular/router\'

 

router.navigate([\'/home\',\'nn\'])

 

get传值的js跳转

除了Router 还需要引用 NavigationExtras (非必要,但参数要按下面对象格式来), 参考以下代码

import {  Router, NavigationExtras } from \'@angular/router\'

 

  var nav:NavigationExtras={

      queryParams:{"xx":"nn"},

      fragment:\'anchor\'

 

    };

     this.router.navigate([\'/home\'],nav);

 

 

7.  父子路由 (嵌套路由)

      路由配置 加了一个children

{path:\'home\',component:HomeComponent ,

children:[

  {path:\'home1\',component:HomeComponent}

 

]}

 

页面写法

<a routerLink="/home/home1"  routerLinkActive="dd">name</a>

需要把子组件加载到父的某一个地方.只要添加 以下标签即可

<router-outlet></router-outlet>

 

 

  

 

 

 

 

 

 

 

                                                                Angular Material

       

  1. 按官方说明安装
  2. 所有的组件使用前都需要在app.component  里提前注册好后才能使用 如下图

 

 

以上是关于Angular 基础记录的主要内容,如果未能解决你的问题,请参考以下文章

typescript Angular最终版本的Angular 2测试片段。代码库https://developers.livechatinc.com/blog/category/programming

typescript Angular最终版本的Angular 2测试片段。代码库https://developers.livechatinc.com/blog/category/programming

typescript Angular最终版本的Angular 2测试片段。代码库https://developers.livechatinc.com/blog/category/programming

Angular 基础记录

Apollo Codegen 没有找到生成代码的操作或片段

滚动经过片段时,Angular 10会获得路由器活动片段吗?