Module

简单来说模块(module)就是完成共同目的的代码块,export一些内容例如一个类、函数、或值变量。

component就是一个基本的Angular块,一个component类其实也是我们从模块中export出来的东西。

Angular本身也是一个有着许多称为“barrels”的库模块的集合。angular2/core 是最主要的Angular库模块。

如果引入的是Angular本身的库模块,import语句直接引用的是模块的名称;如果引入的是自己本地的模块,则需要使用相对路径,例如同一个目录下使用前缀(./)。

import {Component} from 'angular2/core';       // angular的模块
import {AppComponent} from './app.component'; // 自己写的本地模块

Component

组件(Component)控制屏幕实际使用面积的一小块(我们称之为视图的一小块)。简单来说组件完成一些事情来支撑视图(在一个类里),这个类通过属性和方法的API与视图相互作用。

export class HeroListComponent implements OnInit {
constructor(private _service: HeroService){ }
heroes:Hero[];
selectedHero: Hero;
ngOnInit(){
this.heroes = this._service.getHeroes();
}
selectHero(hero: Hero) { this.selectedHero = hero; }
}

Template

模板(Template)是用于定义组件的视图,通过HTML来告诉Angular怎样来渲染这个组件。

<h2>Hero List</h2>
<p><i>Pick a hero from the list</i></p>
<div *ngFor="#hero of heroes" (click)="selectHero(hero)">
{{hero.name}}
</div>
<hero-detail *ngIf="selectedHero" [hero]="selectedHero"></hero-detail>

<hero-detail>是自定义的标签,代表的是HeroDetailComponent,在写Angular模板的时候,将自定义标签和原有标签混合是很常见的。

Metadata

@Component({
selector: 'hero-list',
templateUrl: 'app/hero-list.component.html',
directives: [HeroDetailComponent],
providers: [HeroService]
})
export class HeroListComponent implements OnInit { ... }

通过将metadata附加在类上,来告诉angular:HeroListComponent是一个组件。

通过“@decorator”来添加metadata是Typescript中最简单的方式。“@decorator”是个函数,有其配置参数。

Component metadata的API参考文档

Data Binding

数据绑定是一种统筹模板和组件的机制,我们在模板HTML中增加双花括号等其他标记来告诉Angular怎样连接组件和模板两边。

<div>{{hero.name}}</div>
<hero-detail [hero]="selectedHero"></hero-detail>
<div (click)="selectHero(hero)"></div>

第一行代码:{{hero.name}}是插入(interpolation),将组件的属性hero.name显示在div中。

第二行代码:[hero]是属性绑定(property binding),将父组件的selectedHero属性传给子组件的hero属性。

第三行代码:(click)是事件绑定(event binding),当用户点击时,调用组件的selectHero方法。

<input [(ngModel)]="hero.name">

双向数据绑定:使用ngModel命令,属性值会从组件传送到input框中,同时用户改变input框的值时也会传送回组件,重设组件的属性值(和事件绑定类似)。

Directive

Angular渲染模板的时候,根据给定的命令(directive)来将模板转换成DOM。

命令分为两种:结构(structural)命令和属性(Attribute)命令。通常在标签中出现(在等号的左边)。

<div *ngFor="#hero of heroes"></div>
<hero-detail *ngIf="selectedHero"></hero-detail>

上面的ngFor、ngIf就是两个结构命令,它们可以增加、删除DOM中的元素。

<input [(ngModel)]="hero.name">

ngModel是其中一种属性命令,属性命令改变元素的外观和行为。

Service

服务(Service)囊括的范围很大,任何对我们的应用起到作用的值、函数或特性都能成为service,常见的有:

  • logging service
  • data service
  • message bus
  • tax calculator
  • application configuration
// app/logger.service.ts (class only)
export class Logger {
log(msg: any) { console.log(msg); }
error(msg: any) { console.error(msg); }
warn(msg: any) { console.warn(msg); }
}

上面是一个service类的例子,作用是简单地在浏览器中log一些信息。

组件通常不直接完成一些工作,而是通过service来完成,例如从数据库获取数据、验证用户输入等等。它只维护属性和set|get这些属性的方法(为了数据绑定),而其他工作都交给service。

Dependency Injection

依赖注入(Dependency Injection)是在一个类中产生一个的新的实例的途径,这个实例是它require的依赖的实例。大多数的依赖都是service。

简单来说,Angular通过依赖注入来给组件提供它们需要的service。

// app/hero-list.component (constructor)
constructor(private _service: HeroService){ }

在TypeScript中,Angular通过构造函数的参数,从而知道要提供什么service给组件。以上面为例,HeroListComponent的构造函数表明需要的是HeroService。

Injector维护一个service实例的容器,如果需要的service实例(需要是指在Component Metadata中的providers字段声明?这样就能解释只有父组件声明的话,子组件会和父组件共享一个实例的现象)不在容器里,Injector会增加进它的容器里,当所有需要的service实例都在之后,Angular可以开始调用组件的构造函数。这就是依赖注入的过程。

Angular 2 Architecture Overview的更多相关文章

  1. Spring Security(一) —— Architecture Overview

    摘要: 原创出处 https://www.cnkirito.moe/spring-security-1/ 「老徐」欢迎转载,保留摘要,谢谢! 1 核心组件 一直以来我都想写一写Spring Secur ...

  2. [Angular] Component architecture and Reactive Forms

    It it recommeded that when deals with form component, we can create a container component to hold st ...

  3. 02 Architecture Overview

    本章提要---------------------------------------------arthiecture, and some componentconnect to oracle这一章 ...

  4. Web application architecture overview

  5. BUILDING ANGULAR APPS USING FLUX ARCHITECTURE

    Flux is an architectural pattern based on unidirectional data flow. Although it is originated in the ...

  6. 100 open source Big Data architecture papers for data professionals

    zhuan :https://www.linkedin.com/pulse/100-open-source-big-data-architecture-papers-anil-madan Big Da ...

  7. Intel® RealSense™ SDK Architecture

    In this article, we highlight some of the key changes that you can expect to see in the Intel RealSe ...

  8. Multitier architecture

    Multitier architecture - Wikipedia https://en.wikipedia.org/wiki/Multitier_architecture Common layer ...

  9. UI Framework-1: Aura Graphics Architecture

    Graphics Architecture Overview Each Aura Window owns a corresponding compositor layer. The layer tre ...

随机推荐

  1. 使用NSKeyedArichiver进行归档、NSKeyedUnarchiver进行解档

    一.使用archiveRootObject进行简单的归档 使用NSKeyedArichiver进行归档.NSKeyedUnarchiver进行接档,这种方式会在写入.读出数据之前对数据进行序列化.反序 ...

  2. Struts2 框架的值栈

    1. OGNL 表达式 1.1 概述 OGNL(Object Graphic Navigation Language),即对象图导航语言; 所谓对象图,即以任意一个对象为根,通过OGNL可以访问与这个 ...

  3. java File delete() 失败,又没有报错。

    因为该文件流还没关闭,就执行了delete(),所以删除失败. 先举几个可以删除掉文件和删除不掉文件的例子(先在F盘创建test1.txt文件,然后可以直接拷贝代码到IDE执行),最后总结下原因: 例 ...

  4. lua53编译

    #下载lua包lua-5.3.5 #vs2017新建个空工程,删除lua.c,luac,c,设置配置类型 动态库.dll #编译完成

  5. windows钩子 Hook示例

    1.首先编写一个 win32 dll工程. #include "stdafx.h" int WINAPI add(int a,int b) { return a+b; } BOOL ...

  6. 使用from __future__ import unicode_literals时要注意的问题

    add by zhj: 在Python中有些库的接口要求参数必须是str类型字符串,有些接口要求参数必须是unicode类型字符串.对于str类型的字符串,调用len()和遍历时,其实都是以字节为单位 ...

  7. 踩坑之jinja2注释问题(Flask中)

    报错信息  jinja2.exceptions.TemplateSyntaxError  jinja2.exceptions.TemplateSyntaxError: Expected an expr ...

  8. 练Focus T25必看!T25课表 视频与成功案例汇总

    练Focus T25必看!T25课表 视频与成功案例汇总! [复制链接]  http://jianfei.39.net/thread-3645799-1.html     小西i减肥         ...

  9. 微信小程序学习笔记(3)--------框架之配置

    我们使用app.json文件来对微信小程序进行全局配置,决定页面文件的路径.窗口表现.设置网络超时时间.设置多 tab 等. app.json 配置项列表 属性 类型 必填 描述 pages Stri ...

  10. Django CRM 数据库增删改查

    原文链接 http://www.cnblogs.com/yangmv/p/5327477.html