3、AngularJS2 架构

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

Angular 2 应用程序应用主要由以下 8 个部分组成:

  • 1、模块 (Modules)
  • 2、组件 (Components)
  • 3、模板 (Templates)
  • 4、元数据 (Metadata)
  • 5、数据绑定 (Data Binding)
  • 6、指令 (Directives)
  • 7、服务 (Services)
  • 8、依赖注入 (Dependency Injection)

下图展示了每个部分是如何相互工作的:

overview2.png

图中的模板 (Templates)是由 Angular 扩展的 HTML 语法组成,组件 (Components)类用来管理这些模板,应用逻辑部分通过服务 (Services)来完成,然后在模块中打包服务与组件,最后通过引导根模块来启动应用。

接下来我们会对以上 8 个部分分开解析:

模块

模块又一块代码组成,可用于执行一个简单的任务。

Angular 应用是由模块化的,它有自己的模块系统:NgModules。

每个 Angular 应该至少要有一个模块(根模块),一般可以命名为:AppModule。

Angular 模块是一个带有 @NgModule 装饰器的类,它接收一个用来描述模块属性的元数据对象。

几个重要的属性如下:

  • declarations (声明) - 视图类属于这个模块。 Angular 有三种类型的视图类: 组件 、 指令 和 管道 。

  • exports - 声明( declaration )的子集,可用于其它模块中的组件模板 。

  • imports - 本模块组件模板中需要由其它导出类的模块。

  • providers - 服务的创建者。本模块把它们加入全局的服务表中,让它们在应用中的任何部分都可被访问到。

  • bootstrap - 应用的主视图,称为根组件,它是所有其它应用视图的宿主。只有根模块需要设置 bootstrap 属性中。

一个最简单的根模块:

app/app.module.ts 文件:

import { NgModule }      from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
@NgModule({imports:      [ BrowserModule ],providers:    [ Logger ],declarations: [ AppComponent ],exports:      [ AppComponent ],bootstrap:    [ AppComponent ]
})
export class AppModule { }

接下来我们通过引导根模块来启动应用,开发过程通常在 main.ts 文件中来引导 AppModule ,代码如下:

app/app.module.ts 文件:

import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app.module';platformBrowserDynamic().bootstrapModule(AppModule);

组件(Components)

组件是一个模板的控制类用于处理应用和逻辑页面的视图部分。

组件是构成 Angular 应用的基础和核心,可用于整个应用程序中。

组件知道如何渲染自己及配置依赖注入。

组件通过一些由属性和方法组成的 API 与视图交互。

创建 Angular 组件的方法有三步:

  • 从 @angular/core 中引入 Component 修饰器
  • 建立一个普通的类,并用 @Component 修饰它
  • 在 @Component 中,设置 selector 自定义标签,以及 template 模板

模板(Templates)

Angular模板的默认语言就是HTML。

我们可以通过使用模板来定义组件的视图来告诉 Angular 如何显示组件。以下是一个简单是实例:

<div>
网站地址 : {{site}}
</div>

在Angular中,默认使用的是双大括号作为插值语法,大括号中间的值通常是一个组件属性的变量名。

元数据(Metadata)

元数据告诉 Angular 如何处理一个类。

考虑以下情况我们有一个组件叫作 Component ,它是一个类,直到我们告诉 Angular 这是一个组件为止。

你可以把元数据附加到这个类上来告诉 Angular Component 是一个组件。

在 TypeScript 中,我们用 装饰器 (decorator) 来附加元数据。

实例

@Component({selector : 'mylist',template : '<h2>菜鸟教程</h2>'directives : [ComponentDetails]
})
export class ListComponent{...}

@Component 装饰器能接受一个配置对象,并把紧随其后的类标记成了组件类。

Angular 会基于这些信息创建和展示组件及其视图。

@Component 中的配置项说明:

  • selector - 一个 css 选择器,它告诉 Angular 在 父级 HTML 中寻找一个 <mylist> 标签,然后创建该组件,并插入此标签中。

  • templateUrl - 组件 HTML 模板的地址。

  • directives - 一个数组,包含 此 模板需要依赖的组件或指令。

  • providers - 一个数组,包含组件所依赖的服务所需要的依赖注入提供者。

数据绑定(Data binding)

数据绑定为应用程序提供了一种简单而一致的方法来显示数据以及数据交互,它是管理应用程序里面数值的一种机制。

通过这种机制,可以从HTML里面取值和赋值,使得数据的读写,数据的持久化操作变得更加简单快捷。

如图所示,数据绑定的语法有四种形式。每种形式都有一个方向——从 DOM 来、到 DOM 去、双向,就像图中的箭头所示意的。

databinding.png

  • 插值 : 在 HTML 标签中显示组件值。

    <h3>
    {{title}}
    <img src="{{ImageUrl}}">
    </h3>
  • 属性绑定: 把元素的属性设置为组件中属性的值。

    <img [src]="userImageUrl">
  • 事件绑定: 在组件方法名被点击时触发。

    <button (click)="onSave()">保存</button>
  • 双向绑: 使用Angular里的NgModel指令可以更便捷的进行双向绑定。

    <input [value]="currentUser.firstName"(input)="currentUser.firstName=$event.target.value" >

指令(Directives)

Angular模板是动态的 。当 Angular 渲染它们时,它会根据指令对 DOM 进行修改。

指令是一个带有"指令元数据"的类。在 TypeScript 中,要通过 @Directive 装饰器把元数据附加到类上。

在Angular中包含以下三种类型的指令:

  • 属性指令:以元素的属性形式来使用的指令。
  • 结构指令:用来改变DOM树的结构
  • 组件:作为指令的一个重要子类,组件本质上可以看作是一个带有模板的指令。
<li *ngFor="let site of sites"></li>
<site-detail *ngIf="selectedSite"></site-detail>

*ngFor 告诉 Angular 为 sites 列表中的每个项生成一个 <li> 标签。

*ngIf 表示只有在选择的项存在时,才会包含 SiteDetail 组件。

服务(Services)

Angular2中的服务是封装了某一特定功能,并且可以通过注入的方式供他人使用的独立模块。

服务分为很多种,包括:值、函数,以及应用所需的特性。

例如,多个组件中出现了重复代码时,把重复代码提取到服务中实现代码复用。

以下是几种常见的服务:

  • 日志服务
  • 数据服务
  • 消息总线
  • 税款计算器
  • 应用程序配置

以下实例是一个日志服务,用于把日志记录到浏览器的控制台:

export class Logger {log(msg: any)   { console.log(msg); }error(msg: any) { console.error(msg); }warn(msg: any)  { console.warn(msg); }
}

依赖注入

控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫"依赖查找"(Dependency Lookup)。

通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。

在传统的开发模式中,调用者负责管理所有对象的依赖,循环依赖一直是梦魇,而在依赖注入模式中,这个管理权交给了注入器(Injector),它在软件运行时负责依赖对象的替换,而不是在编译时。这种控制反转,运行注入的特点即是依赖注入的精华所在。

Angular 能通过查看构造函数的参数类型,来得知组件需要哪些服务。 例如, SiteListComponent 组件的构造函数需要一个 SiteService:

constructor(private service: HeroService) { }

当 Angular 创建组件时,会首先为组件所需的服务找一个注入器( Injector ) 。

注入器是一个维护服务实例的容器,存放着以前创建的实例。

如果容器中还没有所请求的服务实例,注入器就会创建一个服务实例,并且添加到容器中,然后把这个服务返回给 Angular 。

当所有的服务都被解析完并返回时, Angular 会以这些服务为参数去调用组件的构造函数。 这就是依赖注入 。

转载于:https://my.oschina.net/u/2246951/blog/753608

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292800.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kubernetes:实现应用不停机更新

本篇主要讨论如何实现滚动更新和回滚&#xff0c;任意更换版本并且回滚以前的版本(版本更新)&#xff0c;而下一章会讨论到 Pod 缩放&#xff0c;根据机器资源自动拓展和收缩应用(自动扩容实例)。本文为作者的 Kubernetes 系列电子书的一部分&#xff0c;电子书已经开源&#x…

iOS 7 如何关闭已打开的应用(App)

刚升级了 iOS 7&#xff0c;感觉不太会用了。 在多任务状态下&#xff0c;看着一个个已被打开的应用&#xff0c;不知道如何关闭了。 问了下朋友才知道&#xff0c;在多任务状态下&#xff0c;将对应的应用 向上划 就行。 听说&#xff0c;和 Android 一样的 &#xff1f;&…

除掉字符串里面相同的字符

题目: 除掉字符串里面相同的字符 such as 字符串“aaaabbbccdd” 出去相同的字符就会变成“abcd” 代码: #include <stdio.h> #include <stdlib.h> #include <string.h>void grepString1(char a[]) {int length = strlen(a);int i = 0, j = 0;for (i=0; i…

inner join 和 exists 效率_一个in、exists、join的简单测试

创建两张表先单独插入两条数据然后批量插入部门号为10,20,30,40的数据各10499099条然后dept表也插些干扰数据测试语句开始验证in和exists和join 先比较个占比多的部门&#xff0c;再比较占比少的 1、 in 占比多 select count(*) from scott.EMP_TEST e where e.deptno in (sele…

httpModules 与 httpHandlers

httpModules 与 httpHandlers ASP.NET对请求处理的过程&#xff1a;当请求一个*.aspx文件的时候&#xff0c;这个请求会被inetinfo.exe进程截获&#xff0c;它判断文件的后缀&#xff08;aspx&#xff09;之后&#xff0c;将这个请求转交给ASPNET_ISAPI.dll&#xff0c;ASPNET_…

uva10160(dfs+状态压缩)

题意&#xff1a;给出n个点&#xff0c;以及m条边&#xff0c;这些边代表着这些点相连&#xff0c;修一个电力站&#xff0c;若在某一点修一个站&#xff0c;那么与这个点相连的点都可以通电&#xff0c;问所有的点都通电的话至少要修多少个电力站........思路&#xff1a;最多…

CAD数据与ArcGIS数据的互转换(转载)

CAD数据往往是分层管理的&#xff0c;将CAD数据转成arcgis数据&#xff0c;最担心的莫过于丢失了属性数据&#xff0c;arcgis9.2提供了一种方法&#xff0c;可以将CAD数据完整的转换为personal geodatabase&#xff0c;属性信息不会丢失&#xff0c;方法如下&#xff1a;ArcToo…

愚人节的礼物-栈

题目: 四月一日快到了,Vayko想了个愚人的好办法――送礼物。嘿嘿,不要想的太好,这礼物可没那么简单,Vayko为了愚人,准备了一堆盒子,其中有一个盒子里面装了礼物。盒子里面可以再放零个或者多个盒子。假设放礼物的盒子里不再放其他盒子。 用()表示一个盒子,B表示礼物,…

Task.Factory.StartNew 和 Task.Factory.FromAsync 有什么区别?

咨询区 soleiljy假设我们有一个涉及IO操作的方法 (读取数据库)&#xff0c;这个方法支持以同步或者异步的方式执行。同步方式IOMethod()异步方式BeginIOMethod() EndIOMethod()接下来我都用 Task 来包装这两个方法。public static void Main(){var task1 Task.Factory.StartN…

多比Web 3D展示(3D机房/3D监控)中间件多比Web 3D展示(3D机房/3D监控)中间件免费下载购买地址...

多比3D是实现3D场景搭建的软件开发包&#xff0c;可以创建广泛的3D应用&#xff0c;适用于高端制造、能源、国防军工、教育科研、城市规划及建筑环艺、生物医学等领域的虚拟仿真&#xff0c;应用于虚拟展示、虚拟设计、方案评审、虚拟装配、虚拟实训等工作环节。 特点与优势 支…

python 工资管理软件_智慧职教云课堂2020Python程序设计(深圳信息职业技术学院)题目答案...

智慧职教云课堂2020Python程序设计&#xff08;深圳信息职业技术学院)题目答案 更新时间&#xff1a;2020-11-23 20:41点击&#xff1a; 智慧职教云课堂2020Python程序设计&#xff08;深圳信息职业技术学院)题目答案 更多相关问题 【判断题】在声明类的成员属性时必须要用关键…

数据结构-Hash总结(二)

转载&#xff1a;http://blog.csdn.net/liufei_learning/article/details/19220391 理解Hash 哈希表(hash table)是从一个集合A到另一个集合B的映射(mapping)。 映射是一种对应关系&#xff0c;而且集合A的某个元素只能对应集合B中的一个元素。但反过来&#xff0c;集合B中的一…

中国已消失的九所世界级大学

全世界只有3.14 % 的人关注了爆炸吧知识众所周知&#xff0c;我们国家的大学数量在世界范围内数一数二&#xff0c;但是有很多赫赫有名的大学却在历史中被人们遗忘&#xff0c;下面我们一起回顾一下那些不该被忘记的大学。>>>>▌燕京大学燕京大学&#xff08;Yench…

IOS Table中Cell的重用reuse机制分析

2019独角兽企业重金招聘Python工程师标准>>> 解决代码&#xff1a; - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { NSString *CellIdentifier [NSString stringWithFormat:"Cell%d%d", …

子商城管理之签到活动

--建表脚本: --create sequence create sequence SIGN_ACTIVITY_SEQ;-- Create table create table SIGN_ACTIVITY (SIGN_ACTIVITY_ID NUMBER not null,START_TIME VARCHAR2(20),END_TIME VARCHAR2(20),ACTIVITY_INTRODUCTION VARCHAR2(300),REWA…

VS2017/2019 F12无法导航到定义

今天对项目里某个对象点F12转到定义&#xff0c;无法跳转,研究了一会儿&#xff0c;找到如下解决方案:首先确认该函数是否能够正确被跳转到..就是是否真实定义了&#xff0c;然后确保要跳转的定义源码在项目文件下&#xff08;而不是直接引用的DLL&#xff09;接下来关闭VS2017…

oracle 主键删除,联合主键的创建

1&#xff0c;主键的删除 ALTER TABLE TABLENAME DROP PRIMARY_KEY运行上面的SQL能够删除主键&#xff1b;假设不成功能够用ALTER TABLE TABLENAME DROP CONSTRAINTS COLUMN CASCADE; --删除约束ALTER TABLE TABLENAME DISABLE PRIMARY_COLUMN ; --设置被设置为主键的列为无效D…

unable to launch什么意思_都表示太...以至于,so … that…?与too… to …有着明显区别...

【2019年12月8日 百天英语-Day135】【华东师范大学-林森撰写】昨日内容复习提要&#xff1a;昨天学习了主要学习了 ①be able to …与can的区别。②如何通过不认识的单词&#xff0c;猜到作者表达的含义。昨天文章如下&#xff1a;表示有能力做某事&#xff0c;be able to …与…