模块

Angular 模块都是一个带有@NgModule装饰器的类。
NgModule是一个装饰器函数,它接收一个用来描述模块属性的元数据对象。把紧随其后的类标记为模块类。其中最重要的属性是:

  • declarations
    声明本模块中拥有的视图类。包括[组件]、[指令]和[管道]。
  • exports(根模块则不需要导出任何东西。)
    导出可用于其它模块的组件[模板]。
  • imports(Angular模块)
    模块声明的组件模板需要的类所在的其它模块。
  • providers
    [服务]的创建者,并加入到全局服务列表中,可用于应用任何部分。
  • bootstrap
    指定应用的主视图(称为根组件),它是所有其它视图的宿主。只有根模块才能设置bootstrap属性。
    app.module.ts中bootstrap了AppComponent,而main.ts文件中bootstrap了AppModule

元数据告诉 Angular 如何处理一个类。我们用装饰器 (decorator) 来附加元数据。@Component装饰器,它把紧随其后的类标记成了组件类。

@Component的配置项包括:

selector:CSS 选择器,在父级 HTML 中查找对应内容,创建并插入该组件。

<li>{{hero.name}}</li> 插值绑定
<hero-detail [hero]="selectedHero"></hero-detail> 属性绑定
<li (click)="selectHero(hero)"></li> 事件绑定
<input [(ngModel)]="hero.name"> 双向绑定

组件是一种特殊的指令

“依赖注入”是提供类的新实例的一种方式,还负责处理好类所需的全部依赖。大多数依赖都是服务
@Injectable()

变量赋值的方式初始化组件,也可以使用构造函数来声明和初始化属性。

插值表达式

<img title="{{heroImageUrl}}">
等价于
<img [title]="heroImageUrl">
等价于
<img bind-title="heroImageUrl">
其他同理

事件绑定

<button (click)="onSave()">Save</button>等价于
<button on-click="onSave()">On Save</button>

<div (myClick)="clickMessage=$event" clickable>click with myClick</div>

<button (click)="onSave($event)">Save</button>//模板对象
<button *ngFor="let hero of heroes" (click)="deleteHero(hero)">{{hero.name}}</button>//模板输入变量
<form #heroForm (ngSubmit)="onSubmit(heroForm)"> ... </form>//模板引用变量

Class设置
<div [class.special]="isSpecial">Special</div>
或者[class]="isSpecial"
或者
<div [ngClass]="currentClasses">This div is initially saveable</div>
其中currentClasses是一个对象,每个key都是类名,value是布尔值

<button [style.color]="isSpecial ? 'red' : 'green'">
或者
<div [ngStyle]="currentStyles">This div is initially italic</div>
其中currentStyles是一个对象,
this.currentStyles = {
'font-style': this.canSave ? 'italic' : 'normal',
'font-weight': !this.isUnchanged ? 'bold' : 'normal',
'font-size': this.isSpecial ? '24px' : '12px'
};

[()]都是双向绑定,而[(ngModel)]依赖[FormsModule]

ngIf指令通常会用来防范空指针错误。

ngSwitch

<div [ngSwitch]="currentHero.emotion">
  <happy-hero    *ngSwitchCase="'happy'"    [hero]="currentHero"></happy-hero>
  <sad-hero      *ngSwitchCase="'sad'"      [hero]="currentHero"></sad-hero>
  <confused-hero *ngSwitchCase="'confused'" [hero]="currentHero"></confused-hero>
  <unknown-hero  *ngSwitchDefault           [hero]="currentHero"></unknown-hero>
</div>

引用变量
<input #phone placeholder="phone number">或者
<input ref-phone placeholder="phone number">

<button (click)="callPhone(phone.value)">Call</button>

模板引用变量的作用范围是整个模板。 不要在同一个模板中多次定义同一个变量名,否则它在运行期间的值是无法确定的。

输入和输出属性

@Input() hero: Hero;
@Output() deleteRequest = new EventEmitter<Hero>();
或者
@Component({
inputs: ['hero'],
outputs: ['deleteRequest'],
})

指定别名
@Output('myClick') clicks = new EventEmitter<string>();
或者
@Directive({
outputs: ['clicks:myClick'] // propertyName:alias
})

管道操作符

类似过滤器
将obj渲染在页面:
<div>{{currentHero | json}}</div>

安全导航操作符( ?. )

{{name}}如果name不存在,则仅仅不渲染
但是{{hero.name}}的hero如果不存在,则直接报错,因此可以采用NgIf环绕保护,或直接

生命周期钩子函数

OnInit()钩子:
在构造函数之后马上执行复杂的初始化逻辑

OnChanges() 钩子:
一旦检测到该组件(或指令)的输入属性发生了变化,Angular就会调用它的ngOnChanges()方法。

每个组件的css只对自身生效
:host为宿主元素伪类选择器,可以选中该组件的宿主元素
指定的styleUrlsURL是相对于应用程序根目录的,它通常是应用的宿主页面index.html所在的地方。

Angular的<ng-container>是一个分组元素,但它不会污染样式或元素布局,因为 Angular 压根不会把它放进 DOM 中。
一般配合*ngFor使用,给其提供一个宿主

$event.target即事件对象元素自身

<input #box (keyup)="0">
<p>{{box.value}}</p>

只有在应用做了些异步事件(如击键),Angular 才更新绑定(并最终影响到屏幕)。将keyup事件绑定到了数字0,这是可能是最短的模板语句。 虽然这个语句不做什么,但它满足 Angular 的要求,所以 Angular 将更新屏幕。

事件(keyup.enter)只关注回车键事件
(blur)事件

<form #heroForm="ngForm">
Angular会在<form>标签上自动创建并附加一个[NgForm]指令。
此时每个input元素都应该有唯一的name属性,否则报错

NgModel 指令不仅仅跟踪状态。它还使用特定的 Angular CSS 类来更新控件,以反映当前状态:
控件被访问过。
ng-touched ng-untouched
控件的值变化了。
ng-dirty ng-pristine
控件的值有效。
ng-valid ng-invalid

<button type="button" class="btn btn-default" (click)="newHero(); heroForm.reset()">New Hero</button>
.reset()方法重置表单.使各状态重置且清空表单内容,尤其是变成ng-pristine

<button type="submit" class="btn btn-success" [disabled]="!heroForm.form.valid">Submit</button>

<input id="name" class="form-control"
       formControlName="name" required >

<div *ngIf="name.invalid && (name.dirty || name.touched)"
     class="alert alert-danger">

  <div *ngIf="name.errors.required">
    Name is required.
  </div>
  <div *ngIf="name.errors.minlength">
    Name must be at least 4 characters long.
  </div>
  <div *ngIf="name.errors.forbiddenName">
    Name cannot be Bob.
  </div>
</div>

不要将 Angular 模块的imports数组与文件顶部的import语句弄混淆了。它们的功能不同。

JavaScript 的import声明允许你访问在其他文件中导出的符号,这样你可以在当前文件引用它们。 我们会往几乎所有类型的应用中加入import语句。 它们与 Angular 毫无关系,Angular 对它们也一无所知。

模块的imports数组是@NgModule元数据中独有的。它告诉 Angular 特定 Angular 模块的信息 — 用@NgModule装饰的类 — 应用需要它们来正常工作。

Angular 模块把组件、指令和管道打包成内聚的功能块,每个模块聚焦于一个特性区域、业务领域、工作流或通用工具。
每个运行在浏览器中的应用都必须导入[BrowserModule],他注册了一些关键的应用服务提供商。 它还包括了一些通用的指令,例如[NgIf]和[NgFor],所以这些指令在该模块的任何组件模板中都是可用的。

启动模块为根模块,自定义的其他模块叫特性模块。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容

  • 学习资料来自 Angular.cn 与 Angular.io。 根模块 (root module) 每个应用都至少...
    小镭Ra阅读 5,056评论 1 3
  • Module Component(一)Angular应用是模块化的,并且Angular有自己的模块系统,它被称为A...
    关关雎鸠1206阅读 825评论 0 0
  • 音乐52赫兹(lovely版) 昨天刷完了一个半小时的奇葩说半决赛,网速卡顿,缓冲到每一帧都是奇葩选手的表情包,焦...
    奈良鹿阅读 7,436评论 0 3
  • 在家学习的目标都能基本完成,好棒!
    秒秒瞬间阅读 320评论 3 2
  • 市场长期处于波动状态,而投资市场也是如此。以前人们爱用过山车形容刺激的感觉,而现在用蹦极来形容也许更贴切不过了。 ...
    leon886阅读 567评论 0 0