文档

组件的工作只管用户体验,而不用顾及其它。 它应该提供用于数据绑定的属性和方法,以便作为视图和应用逻辑的中介者

组件应该把诸如从服务器获取数据验证用户输入或直接往控制台中写日志等工作委托给各种服务。通过把各种处理任务定义到可注入的服务类中,你可以让它被任何组件使用

插值表达式

<div>{{ title }}</div>
<div>{{ !!title ? 1 : 2}}</div>
<div>{{ title() }}</div> // 变量与字符串的拼接
<li *ngFor="let item of arr" title="{{item}}.txt">{{item}}</li>
<li *ngFor="let item of arr" [title]="item + '.txt'">{{item}}</li> // 渲染dom标签
<div [innerHTML]="h"></div>
h = `<h2>title</h2>`

for循环

trackByFn 返回唯一id

<li *ngFor="let item of items; index as i; trackBy: trackByFn">...</li>
  trackByName(index, it) {
return it.id;
}
arr = ['red', 'blue', 'green'];
<ul *ngFor="let item of arr; index as i; first as f; last as l; even as e; odd as o">
<li [style.color]="item">
item = {{ item }},<br />
index = {{ i }},<br />
Fist? = {{ f }},<br />
Last? = {{ l }},<br />
偶素? = {{ e }},<br />
奇数? = {{ o }}<br />
</li>
</ul>

循环number

@Pipe({name: 'demoNumber'})
export class DemoNumber implements PipeTransform {
transform(value, args:string[]) : any {
let res = [];
for (let i = 0; i < value; i++) {
res.push(i);
}
return res;
}
}
<ul>
<li>Method First Using PIPE</li>
<li *ngFor='let key of 5 | demoNumber'>
{{key}}
</li>
</ul>

硬编码

<ul>
<li>Method Second</li>
<li *ngFor='let key of [1,2]'>
{{key}}
</li>
</ul>

事件和属性绑定

<button (click)="alert()" [title]="title">click</button>

双向绑定

import { FormsModule } from '@angular/forms';
@NgModule({
imports: [FormsModule] // 需要这个模块,通常在shared模块中导出
})
<input type="text" name="name" [(ngModel)]="name" /> {{ name }}

展开双向绑定

<input type="text" name="name" [(ngModel)]="name" (ngModelChange)="nameChange($event)"/> {{ name }}
  name = "ajanuw";
nameChange(v: string) {
this.name = v.toLocaleUpperCase();
}

if

  myName = '';
ngOnInit() {
setTimeout(() => this.myName = 'alone', 2000);
}
<p *ngIf="myName; else elesTemp" >{{ myName }}</p>
<ng-template #elesTemp>
<p> 暂无数据!</p>
</ng-template>

if/then/else

<p *ngIf="myName; then thenTemp; else elesTemp"></p>
<ng-template #thenTemp>
<p>{{ myName }}</p>
</ng-template>
<ng-template #elesTemp>
<p> 暂无数据!</p>
</ng-template>

ngSwitch

<div [ngSwitch]="name">
<p *ngSwitchCase="'ajanuw'">hello {{name}}</p>
<p *ngSwitchCase="'coo'">bey bey {{name}}</p>
<p *ngSwitchCase="'boo'">i'm {{name}}...</p>
<p *ngSwitchDefault>not name!</p>
</div>

模板引用变量

<div>{{ name.name }}_{{ name.value }}</div>
<input type="text" name="name" value="123" #name />
<button (click)="onClick(name.value)">click me</button> onClick(v: string) {
l(v); // 123
} // 获取组件实例(只能在模板中调用),类似react使用ref获取组件实例
<app-hello #hello></app-hello>
<button (click)="hello.event()">click me</button>

管道

<p>{{ 'ajanuw' | uppercase }}</p>  全大写 -> AJANUW
<p>{{ 'Ajanuw' | lowercase }}</p> 全小写 -> ajanuw
<p>{{ 'hi ajanuw' | titlecase }}</p> 单词首写大写 -> Hi Ajanuw
<p>{{ {name: 'ajanuw'} | json }}</p> onj => json
<p>{{ 'ajanuw' | slice:1:3 }}</p> 类似js的slice -> ja

处理number

<p>{{ 3.141 | number:'1.2-2' }}</p> -> 3.14
<p>{{ 3.141 | number:'1.1-3' }}</p> -> 3.141
<p>{{ 3.141 | number:'2.1-1' }}</p> -> 03.1
<p>{{ 3.141 | number:'2.4-4' }}</p> -> 03.1410
<p>{{ 0.5 | percent }}</p> 百分比 -> 50% <p>美元: {{ 5 | currency }}</p> 这两个都没什么卵用
<p>英镑:{{ 5 | currency:'GBP' }}</p>

自定义管道

  1. 创建
ng g @schematics/angular:pipe mathCeil --project=angular-universal --module=app.module.ts --no-spec
  1. 使用
<div>{{ 12.3 | mathCeil: 2 }}</div>
  1. 实现
import { Pipe, PipeTransform } from "@angular/core";

@Pipe({
name: "mathCeil",
})
export class MathCeilPipe implements PipeTransform { /**
* @param value 传入的值
* @param args 传入的参数
*/
transform(value: number, args?: number): any {
console.log(args); // 2
return Math.ceil(value);
}
}

父子组件传递参数 组件之间的交互

<app-hello [name]="name" (onAlert)="onAlert($event)"></app-hello>

  name = "ajanuw";
onAlert(v: string) {
l(v);
}

Input输入, Output 输出

<h2 (click)="handleClick()">{{name}}</h2>

@Input() name: string;
@Output() onAlert = new EventEmitter<string>();
handleClick() {
this.onAlert.emit("hello...");
}

属性型指令

  1. 创建指令
ng g directive highlight
  1. 使用
<h1 [appHighlight]="'blue'" [defaultColor]="'#f48'">Welcome to {{ title }}!</h1>
  1. 实现
import { Directive, ElementRef, HostListener, Input } from "@angular/core";

const l = console.log;
@Directive({
selector: "[appHighlight]",
})
export class HighlightDirective {
@Input("appHighlight")
public color: string; // 设置选中时的颜色 // 初始化时的颜色
@Input()
public set defaultColor(color: string) {
this.setColor(color);
} // el: 获取指令绑定的dom元素
constructor(private readonly el: ElementRef) {} // 响应用户引发的事件
@HostListener("mouseenter")
public onMouseEnter(): void {
this.setColor(this.color || "red");
} @HostListener("mouseleave")
public onMouseLeave(): void {
this.setColor(null);
} private setColor(color: string): void {
this.el.nativeElement.style["color"] = color;
}
}

结构型指令

  1. 创建指令
ng g @schematics/angular:directive delay --project=angular-universal --module=app.module.ts --no-spec
  1. 使用
  <div *appDelay="1200">
hello <ng-container *ngIf="!!username"> {{ username }} </ng-container>
</div>
  1. 实现

    delay.directive.ts
import {
Directive,
Input,
TemplateRef,
ViewContainerRef,
OnDestroy,
} from "@angular/core"; @Directive({
selector: "[appDelay]",
})
export class DelayDirective implements OnDestroy {
private timer: NodeJS.Timer;
constructor(
private readonly templateRef: TemplateRef<any>,
private readonly viewContainer: ViewContainerRef,
) {} // 延迟加载dom
@Input()
public set appDelay(delayNum: number) {
this.timer = setTimeout(() => {
this.viewContainer.createEmbeddedView(this.templateRef);
}, delayNum);
} ngOnDestroy(): void {
clearTimeout(this.timer);
}
}

ViewChild

获取子组件的实例,和dom节点

<app-hello></app-hello>
<button (click)="onClick()">click me</button> import { Component, OnInit, AfterViewInit, ViewChild } from "@angular/core";
import { HelloComponent } from "./hello/hello.component"; export class AppComponent implements OnInit, AfterViewInit { @ViewChild(HelloComponent)
private helloRef: HelloComponent; // 注入HelloComponent实例到helloRef ngOnInit(): void {} // 组件的视图初始化之后
ngAfterViewInit() {
this.helloRef.handleOk(); // 调用HelloComponent实例的方法
} onClick() {
this.helloRef.handleOk();
}
}

获取dom节点

   <div #test>hello</div>

  @ViewChild("test") public testRef: ElementRef;

  ngAfterViewInit(): void {
console.log(this.testRef.nativeElement.textContent); // hello
}

children

ng-content 获取所有children,用select获取指定children,不能重复获取

<app-hello>
<h2>hello</h2>
<footer>footer</footer>
</app-hello> // app-hello 获取children
<div class="a">
<ng-content select='footer'></ng-content>
<ng-content select='h2'></ng-content>
</div>

? ! $any()

The current hero's name is {{currentHero?.name}}  // 安全返回

<div *ngIf="hero">
The hero's name is {{hero!.name}} // 非空断言操作符
</div> Undeclared members is {{$any(this).member}} // 使用 $any 转换函数来把表达式转换成 any 类型

绑定class

  classes = {
'text-danger': true,
'text-success': false,
'p-2': true
};
<p class="a" [class]="'text-danger'">{{ txt() }}</p>  // 'text-danger'
<p class="a" [class.text-danger]="true">{{ txt() }}</p> // 'a text-danger'
<p class="a" [ngClass]="classes">{{ txt() }}</p> // 'a text-danger p-2'

绑定style

  styles = {
color: 'red',
padding: '1rem',
backgroundColor: '#e5e5ef75',
display: 'inline-block'
};
<p style="font-family: Consolas;" [style.color]="'red'">{{ txt() }}</p>
<p style="font-family: Consolas;" [ngStyle]="styles">{{ txt() }}</p>

设置proxy

proxy.conf.json

{
"/api": {
"target": "http://localhost:5000",
"secure": false,
"pathRewrite": {
"^/api": ""
}
}
}
  ngOnInit() {
this.msg$ = this.http.get("/api/ng7", {
responseType: "text",
});
}

ng-container

用来挂载结构型指令, 避免使用多余的 html 元素挂载指令

<div>
hello <ng-container *ngIf="!!username"> {{ username }} </ng-container>
</div> <div>
hello <span *ngIf="!!username"> {{ username }} </span>
</div>

按键事件

<input #box (keyup.enter)="onEnter(box.value); box.value=''">

ng 基础的更多相关文章

  1. AngularJS 1.2.x 学习笔记(表单校验篇)

    https://my.oschina.net/cokolin/blog/526911 摘要: 本文首发于 blog.csdn.net/vipshop_ebs/article/details/39472 ...

  2. Angular CLI命令

    ng 基础命令 npm install –g @angular/cli npm install -g @angular/cli@latest ng serve –prot –aot 启动项目并压缩项目 ...

  3. Nginx导航

    简介 最近都在弄微服务的东西,现在来记录下收获.我从一知半解到现在能从0搭建使用最大的感触有两点 1.微服务各大组件的版本很多,网上很多博客内容不一定适合你的版本,很多时候苦苦琢磨都是无用功 2.网上 ...

  4. matlab基础教程——根据Andrew Ng的machine learning整理

    matlab基础教程--根据Andrew Ng的machine learning整理 基本运算 算数运算 逻辑运算 格式化输出 小数位全局修改 向量和矩阵运算 矩阵操作 申明一个矩阵或向量 快速建立一 ...

  5. ng机器学习视频笔记(一)——线性回归、代价函数、梯度下降基础

    ng机器学习视频笔记(一) --线性回归.代价函数.梯度下降基础 (转载请附上本文链接--linhxx) 一.线性回归 线性回归是监督学习中的重要算法,其主要目的在于用一个函数表示一组数据,其中横轴是 ...

  6. Andrew Ng - 深度学习工程师 - Part 1. 神经网络和深度学习(Week 2. 神经网络基础)

     =================第2周 神经网络基础=============== ===2.1  二分分类=== ===2.2  logistic 回归=== It turns out, whe ...

  7. angular学习的一些小笔记(中)之基础ng指令

    一.布尔属性指令: ng-disabled:就是ng-disabled=true-->就指向不可用 <!doctype html> <html ng-app="&qu ...

  8. 写在读ng之前的基础知识----笔记

    如果要看angular的代码, 先把这个给看了, 司徒的干货. /******************************************************************* ...

  9. 【Machine Learning】机器学习及其基础概念简介

    机器学习及其基础概念简介 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

随机推荐

  1. ECMAScript6常用新特性总结

    一.let声明变量 1.基本用法: ES6 新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. 如下代码: { let a = 10; var ...

  2. VMware虚拟机串口与宿主机进行传输验证

    一.验证目的 1.验证VMWARE虚拟机(Windows或Linux)上的程序,是否可以读取宿主服务器的物理串口中的数据. 二.验证过程 1.验证条件及工具, 宿主机:Windows 10 x64 V ...

  3. python模块----configpaser (key:value型 配置文件解析器)

    configparser是用来读取配置文件的包,配置文件的格式类似:[section]+内容(键=值) 标准库网址:https://docs.python.org/3/library/configpa ...

  4. CentOS7.X安装英伟达显卡采坑之路

    1.系统信息 操作系统版本:CentOS7.X 显卡版本:英伟达 Tesla P100 其他软件包安装信息: CUDA 9.0 CUDNN 7.4.2.24 lightgbm 2.2.X Boost ...

  5. CCF CSP 202012-3 文件配额

    题目背景 小 H 同学发现,他维护的存储系统经常出现有人用机器学习的训练数据把空间占满的问题,十分苦恼. 查找了一阵资料后,他想要在文件系统中开启配额限制,以便能够精确地限制大家在每个目录中最多能使用 ...

  6. 如何用RabbitMQ实现延迟队列

    前言 在 jdk 的 juc 工具包中,提供了一种延迟队列 DelayQueue.延迟队列用处非常广泛,比如我们最常见的场景就是在网购或者外卖平台中发起一个订单,如果不付款,一般 15 分钟后就会被关 ...

  7. Unity3d开发中遇到的问题记录

    安装Unity unity官方提供免费的community版本,功能健全,下载时还有Visual Studio,非常方便. 官方文档 Unity的官方文档非常权威!详尽!可靠!很多关于函数细节的疑惑都 ...

  8. 深入浅出Java线程池:源码篇

    前言 在上一篇文章深入浅出Java线程池:理论篇中,已经介绍了什么是线程池以及基本的使用.(本来写作的思路是使用篇,但经网友建议后,感觉改为理论篇会更加合适).本文则深入线程池的源码,主要是介绍Thr ...

  9. Snapshot查询所有快照

    今天使用snapshot list这个命令时查询出了所有的表,没注意下面报错: NoMethodError:undefined method '-@' for #<Array:0x54326e9 ...

  10. POJ 1743 Musical Theme【SAM】

    POJ1743 Musical Theme 要找长度\(\ge 5\)且出现次数\(\ge 2\)并且第一次出现和最后一次出现不重叠的最长子串. 题目条件中,如果对于两个串,在一个串的每个数上都加上相 ...