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…

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_…

多比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;深圳信息职业技术学院)题目答案 更多相关问题 【判断题】在声明类的成员属性时必须要用关键…

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

全世界只有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", …

VS2017/2019 F12无法导航到定义

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

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

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

求指教、。。。关于调用so文件

问题描述今天同事给我发来一个文件&#xff0c;说让我通过android调用里面的函数文件是&#xff1a;里面的内容是&#xff1a;call_so.cpp文件的内容&#xff1a;#pragma pack(1) //非常重要的申明&#xff0c;内存对齐的方法&#xff0c;影响sizeof()的结果#include <stdio…

人类历史上最伟大的物理学家

全世界只有3.14 % 的人关注了爆炸吧知识一沙见世界 一花窥天堂手心握无限 须臾纳永恒杨振宁曾说读上面的四句诗可以感受到物理的美但物理的美不止于此物理还有一种庄严美一种神秘美一种初窥宇宙奥秘的畏惧美物理就是如此的迷人任何语言在它的面前都很贫瘠数学让人摆脱了愚昧而…

DevToys - 开发人员的瑞士军刀

DevToys 是一个适用于开发人员的工具箱, 基于 UWP 开发, DevToys 旨在拥抱 Windows 生态系统, 免费并且开源, 拥有现代化的界面, 支持中文, 有深色/浅色主题可选, 并且它是离线化的, 所以你完全可以在无网络环境中使用。你可以使用它处理与开发相关的一些任务, 它提供 了14…

python写小猪佩奇_python之小猪佩奇

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 小猪佩奇 &#xff08;源码有点长&#xff09;# coding:utf-8 import turtle as t t.pensize(4) t.hideturtle() t.colormode(255) t.color((255,155,192),"pink") t.setup(840,500) t.speed(10) #鼻子 t.pu() t.goto(-…

你和985硕博研究生,差了这些东西

全世界只有3.14 % 的人关注了爆炸吧知识明明都是在搞科研为什么别人的思路比你开阔&#xff1f;明明都是在写文章为什么别人的方向比你更新颖&#xff1f;今天小编就来推荐几个能拓展视野的公号快点收藏起来吧&#xff01;募格课堂ID&#xff1a;mugeketang推荐理由&#xff1a…

产品运行所需的信息检索失败_禁煤后用什么替代锅炉?看看三种热源运行费用对比就知道了...

山西是我国的煤炭大省&#xff0c;煤炭资源丰富&#xff0c;自然而然也是燃煤大省。在打赢蓝天保卫战的目标任务下&#xff0c;拆除燃煤锅炉&#xff0c;改用清洁能源产品是大势所趋。这样的市场背景下&#xff0c;显然可见的是&#xff0c;山西地区将会迎来一大波的燃煤锅炉改…

图像处理技术(三)白平衡

在现实生活中&#xff0c;同学们经常会出旅游、去景点打卡&#xff0c;拍照&#xff0c;发个朋友圈&#xff0c;如果遇到阴雨天、雾霾天或者沙尘天气&#xff0c;那拍照的效果&#xff0c;可是让人头疼。好不容易去北京故宫玩一次&#xff0c;这不&#xff0c;遇到这种天气&…

mysql查看日志命令_面对成百上千台服务器产生的日志,试试这款轻量级日志搬运神器!

之前我们搭建的ELK日志收集系统&#xff0c;主要是用来收集SpringBoot应用的日志。其原理是应用通过Logstash插件&#xff0c;使用TCP向Logstash传输日志&#xff0c;从而存储到Elasticsearch中去。但是有很多中间件的日志都是直接存储在文件中的&#xff0c;比如Nginx、Elasti…