<div *ngIf="isLoggedIn; else loggedOut">
Welcome back, friend.
</div>
<ng-template #loggedOut>
Please friend, login.
</ng-template>
复制代码
<ng-template [ngIf]="isLoggedIn" [ngIfElse]="loggedOut">
Welcome back, friend.
</ng-template>
<ng-template #loggedOut>
Please friend, login.
</ng-template>
复制代码
<ng-container *ngIf="isLoggedIn;then loggedIn;loggedOut">
<ng-container>
<ng-template #loggedIn>
Welcome back, friend.
</ng-template>
<ng-template #loggedOut>
Please friend, login.
</ng-template>
复制代码
<div [hidden]="!isLoggedIn">
Welcome back, friend.
</div>
复制代码
export const heroDetail = {
bindings: {
hero: '<',
deleted: '&'
},
template: `
<h2>{{$ctrl.hero.name}} details!</h2>
<div><label>id: </label>{{$ctrl.hero.id}}</div>
<button ng-click="$ctrl.onDelete()">Delete</button>
`,
controller: function() {
this.onDelete = () => {
this.deleted(this.hero);
};
}
};
复制代码
import { Directive, ElementRef, Injector, Input, Output, EventEmitter } from '@angular/core';
import { UpgradeComponent } from '@angular/upgrade/static';
import { Hero } from '../hero';
@Directive({
selector: 'hero-detail'
})
export class HeroDetailDirective extends UpgradeComponent {
# 须要对应于angularjs组件定义的数据绑定
@Input() hero: Hero;
@Output() deleted: EventEmitter<Hero>;
constructor(elementRef: ElementRef, injector: Injector) {
super('heroDetail', elementRef, injector);
}
}
复制代码
import { Component } from '@angular/core';
import { Hero } from '../hero';
@Component({
selector: 'my-container',
template: `
<h1>Tour of Heroes</h1>
<hero-detail [hero]="hero"
(deleted)="heroDeleted($event)">
</hero-detail>
`
})
export class ContainerComponent {
hero = new Hero(1, 'Windstorm');
heroDeleted(hero: Hero) {
hero.name = 'Ex-' + hero.name;
}
}
复制代码
结构指令:css
<li *ngFor="let hero of heroes">
{{ hero }}
</li>
复制代码
<li *ngIf="isHidden">
{{ hero }}
</li>
复制代码
属性指令:html
# 动态绑定,更新会触发对应子组件
<app-hero-detail [hero]="currentHero"></app-hero-detail>
# 绑定字符串,非变量值
<app-item-detail childItem="parentItem"></app-item-detail>
复制代码
<w-button (click)="handlerClick" />
# 双向数据绑定
<input [(ngModel)]="currentItem.name">
# 等效于
<input [value]="currentItem.name"
(input)="currentItem.name=$event.target.value" >
复制代码
<button [attr.aria-label]="help">help</button>
<div [class.special]="isSpecial">Special</div>
<button [style.color]="isSpecial ? 'red' : 'green'">
<button [class]="{foo: true, bar: false}" />
复制代码
import { Component, Input, Output, EventEmitter } from '@angular/core';
@Component({
selector: 'app-sizer',
templateUrl: './sizer.component.html',
styleUrls: ['./sizer.component.css']
})
export class SizerComponent {
@Input() size: number | string;
@Output() sizeChange = new EventEmitter<number>();
dec() { this.resize(-1); }
inc() { this.resize(+1); }
resize(delta: number) {
this.size = Math.min(40, Math.max(8, +this.size + delta));
this.sizeChange.emit(this.size);
}
}
# html
<app-sizer [(size)]="fontSizePx"></app-sizer> 等效于
<app-sizer [size]="fontSizePx" (sizeChange)="fontSizePx=$event"></app-sizer>
复制代码
<div *ngIf="isLoggedIn">
Welcome back, friend.
</div>
# 等效于
<ng-template [ngIf]="isLoggedIn">
Please friend, login.
</ng-template>
复制代码
# html
<fa-input icon="envelope">
<i class="fa fa-envelope"></i>
<input inputRef type="email" placeholder="Email">
</fa-input>
# js component
@Component({
selector: 'fa-input',
template: `
<ng-content ></ng-content> # 匹配fa-input全部其余的没有指定匹配的
<ng-content select="input"></ng-content> # 匹配fa-input中特定的input标签
`})
export class FaInputComponent {
...
}
复制代码
import { Injectable } from '@angular/core';
# inject root 利用webpack tree-shaking,优化打包
@Injectable({
providedIn: 'root',
})
export class UserService {
}
复制代码
@NgModule({
...
providers: [UserService],
...
})
复制代码
#html
<div #mydiv><input></div>
# js
@ViewChild('mydiv') mydiv: ElementRef
constructor(
private el:ElementRef,
private renderer2: Renderer2){
}
ngOnInit(){
this.renderer2.setStyle(this.el.nativeElement.querySelector('.btn1'),'background','green');
}
# 尽可能减小应用层与渲染层之间强耦合关系, 推荐下方的render2
复制代码
# render2 api
abstract data: {...}
destroyNode: ((node: any) => void) | null
abstract destroy(): void
abstract createElement(name: string, namespace?: string): any
abstract createComment(value: string): any
abstract createText(value: string): any
abstract appendChild(parent: any, newChild: any): void
abstract insertBefore(parent: any, newChild: any, refChild: any): void
abstract removeChild(parent: any, oldChild: any, isHostElement?: boolean): void
abstract selectRootElement(selectorOrNode: any, preserveContent?: boolean): any
abstract parentNode(node: any): any
abstract nextSibling(node: any): any
abstract setAttribute(el: any, name: string, value: string, namespace?: string): void
abstract removeAttribute(el: any, name: string, namespace?: string): void
abstract addClass(el: any, name: string): void
abstract removeClass(el: any, name: string): void
abstract setStyle(el: any, style: string, value: any, flags?: RendererStyleFlags2): void
abstract removeStyle(el: any, style: string, flags?: RendererStyleFlags2): void
abstract setProperty(el: any, name: string, value: any): void
abstract setValue(node: any, value: string): void
abstract listen(target: any, eventName: string, callback: (event: any) => boolean | void): () => void
复制代码
@Component({
selector: 'fa-input',
template: `
<i class="fa" [ngClass]="classes"></i>
`,
styleUrls: ['./fa-input.component.css']
})
export class FaInputComponent {
@Input() icon: string;
get classes() {
const cssClasses = {
fa: true
};
cssClasses['fa-' + this.icon] = true;
return cssClasses;
}
}
复制代码
import { Directive, HostBinding, HostListener } from '@angular/core';
@Directive({
selector: '[highLight]' # 定义指令
})
export class HighLightDirective{
colors = [
'hotpink', 'lightskyblue', 'goldenrod', 'peachpuff'
];
@HostBinding('style.color') color: string;
@HostBinding('style.borderColor') borderColor: string; # 定义样式
@HostListener('keydown') onKeydown(){ # 定义监听
const color = Math.floor(Math.random() * this.colors.length);
this.color = this.borderColor = this.colors[colorPick];
}
}
复制代码
内联元素以及没有 CSS 样式的元素的 clientWidth 属性值为 0。Element.clientWidth 属性表示元素的内部宽度,以像素计。该属性包括内边距 padding,但不包括边框 border、外边距 margin 和垂直滚动条(若是有的话)。 当在根元素(元素)上使用clientWidth时(或者在上,若是文档是在quirks(怪异)模式下),将返回viewport的宽度(不包括任何滚动条).node
始终指内容宽度,不包括borderjquery
# scss 文件
input {
border: none;
outline: none;
}
# 界面运行时css
input[_ngcontent-c0] {
border: none;
outline: none;
}
# 此时须要添加编译处理
:host ::ng-deep input {
border: none;
outline: none;
}
复制代码