欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

Angular2学习笔记——NgModule angular2入门,就这一篇就够了 有大用



Angular2学习笔记——NgModule

  在Angular2中一个Module指的是使用@NgModule修饰的class。@NgModule利用一个元数据对象来告诉Angular如何去编译和运行代码。一个模块内部可以包含组件、指令、管道,并且可以将它们的访问权限声明为公有,以使外部模块的组件可以访问和使用到它们。

  模块是用来组织应用的,通过模块机制外部类库可以很方便的扩展应用,Rc5之后,Angular2将许多常用功能都分配到一个个的模块中,如:FormModule、HttpModule、RouterModule。

  NgModule的主要属性如下:

  • declarations:模块内部Components/Directives/Pipes的列表,声明一下这个模块内部成员

  •                 不要在 declarations 添加组件、指令和管道以外的其他类型。

  •                 不要把 NgModel(或 FORMS_DIRECTIVES)加到 AppModule 元数据的 declarations 数据中!这些指                  令属于 FormsModule。
                    组件、指令和管道只能属于一个模块。

  •                 组件是 Angular 应用程序中的常见构建块。每个组件都需要在 @NgModule.declarations 数                    组中声明,才能够使用。

  •                   在 Angular 中是不允许在多个模块中声明同一个组件,如果一个组件在多个模块中声明的                        话,那么 Angular 编译器将会抛出异常。

  •                   永远不要再次声明属于其它模块的类。

  • providers:指定应用程序的根级别需要使用的service。(Angular2中没有模块级别的service,所有在NgModule中声明的Provider都是注册在根级别的Dependency Injector中)

  • imports:导入其他module,其它module暴露的出的Components、Directives、Pipes等可以在本module的组件中被使用。比如导入CommonModule后就可以使用NgIf、NgFor等指令。

  • exports:用来控制将哪些内部成员暴露给外部使用。导入一个module并不意味着会自动导入这个module内部导入的module所暴露出的公共成员。除非导入的这个module把它内部导入的module写到exports中。

  • bootstrap:通常是app启动的根组件,一般只有一个component。bootstrap中的组件会自动被放入到entryComponents中。

  • entryCompoenents: 不会再模板中被引用到的组件。这个属性一般情况下只有ng自己使用,一般是bootstrap组件或者路由组件,ng会自动把bootstrap、路由组件放入其中。 除非不通过路由动态将component加入到dom中,否则不会用到这个属性。

  每个Angular2的应用都至少有一个模块即跟模块。

复制代码
import {NgModule} from '@angular/core';
import {BrowserModule} from '@angular/platform-borwser';
import {AppComponent} from './AppComponent';

@NgModule({
    declarations: [AppComponent],
    imports: [BrowserModule],
    bootstrap: [AppComponent]
})
export class AppModule{}
复制代码

 

  随着程序的壮大,单一的根模块已不能清晰的划分职责,这时候便可以引入Feature Module。Feature Module与根模块的创建方式一样,所有的模块共享一个运行期上下文和依赖注入器。

  功能模块与根模块的职责区别主要有以下两点:

  • 根模块的目的在于启动app,功能模块的目的在于扩展app

  • 功能模块可以根据需要暴露或隐藏具体的实现

 

  Angular2提供的另一个与模块有关的技术就是延迟加载了。默认情况下Angular2将所有的代码打包成一个文件,目的是为了提高应用的流畅性,但是如果是运行在mobile中的app,加载一个大文件可能会过慢,所以rc5提供了一种延迟加载方式。

复制代码
template: `
  <app-title [subtitle]="subtitle"></app-title>
  <nav>
    <a routerLink="contact" routerLinkActive="active">Contact</a>
    <a routerLink="crisis"  routerLinkActive="active">Crisis Center</a>
    <a routerLink="heroes"  routerLinkActive="active">Heroes</a>
  </nav>
  <router-outlet></router-outlet>
`
复制代码

 

复制代码
import { ModuleWithProviders }  from '@angular/core';
import { Routes, RouterModule } from '@angular/router';

export const routes: Routes = [
  { path: '', redirectTo: 'contact', pathMatch: 'full'},
  { path: 'crisis', loadChildren: 'app/crisis/crisis.module#CrisisModule' },
  { path: 'heroes', loadChildren: 'app/hero/hero.module#HeroModule' }
];

export const routing: ModuleWithProviders = RouterModule.forRoot(routes);
复制代码

  其中,path指明路径,loadChildren指明使用延迟加载,'app/crisis/crisis.module#CrisisModule'指明了模块的路径,和模块的名称。

  

https://www.cnblogs.com/dojo-lzz/p/5878073.html


   


   


   

背景与概念:    

AngularJS2 是一款开源JavaScript库,由Google维护,用来协助单一页面应用程序运行。

AngularJS2 是 Angular 1.x 的升级版本,性能上得到显著的提高,能很好的支持 Web 开发组件。

AngularJS2 发布于2016年9月份,它是基于ES6来开发的。

Angular2.x与Angular1.x 的区别

Angular2.x与Angular1.x 的区别类似 Java 和 JavaScript 或者说是雷锋与雷峰塔的区别,所以在学习Angular2.x时大家需要做好重新学习一门语言的心里准备。

开工前的准备工作

学习AngularJS2前,你需要具备基本的前端基础:HTML、CSS、JavaScript。此外你还需要了解 NPM 及 TypeScript。

Angular 2 架构

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

  • 1、模块 (Modules)

  • 2、组件 (Components)

  • 3、模板 (Templates)

  • 4、元数据 (Metadata)

  • 5、数据绑定 (Data Binding)

  • 6、指令 (Directives)

  • 7、服务 (Services)

  • 8、依赖注入 (Dependency Injection)

下面看每个部分是如何相互工作的:

angular2入门,就这一篇就够了    

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

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

1.模块    

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

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

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

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

几个重要的属性如下:

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

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

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

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

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

一个最简单的根模块,eg:

import{NgModule}from'@angular/core';

import{BrowserModule}from'@angular/platform-browser';

@NgModule({imports: [BrowserModule],

providers: [Logger],

declarations: [AppComponent],

exports: [AppComponent],

bootstrap: [AppComponent]})exportclassAppModule{}

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

import{platformBrowserDynamic}from'@angular/platform-browser-dynamic';

import{AppModule}from'./app.module';

platformBrowserDynamic().bootstrapModule(AppModule);

2.组件(Components)    

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

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

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

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

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

  • 从 @angular/core 中引入 Component 修饰器

  • 建立一个普通的类,并用 @Component 修饰它

  • 在 @Component 中,设置 selector 自定义标签,以及 template 模板

3.模板(Templates)    

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

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

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

4.元数据(Metadata)    

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

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

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

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

eg:

@Component({

selector : 'mylist',

template : '<h2>菜鸟教程</h2>'

directives : [ComponentDetails]

})

export class ListComponent{...}

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

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

@Component 中的配置项说明:

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

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

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

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

5.数据绑定(Data binding)    

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

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

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

angular2入门,就这一篇就够了    

插值: 在 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" >

6.指令(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 组件。

7.服务(Services)    

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

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

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

以下是几种常见的服务:

  • 日志服务

  • 数据服务

  • 消息总线

  • 税款计算器

  • 应用程序配置

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

export class Logger {

log(msg: any) { console.log(msg); }

error(msg: any) { console.error(msg); }

warn(msg: any) { console.warn(msg); }

}

8.依赖注入    

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

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

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

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

constructor(private service: HeroService) { }

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

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

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

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

 


 

更多angular1/2/4、ionic1/2/3、react、vue、微信小程序、nodejs等技术文章、视频教程和开源项目,请关注微信公众号——全栈弄潮儿

   
分类: angular    
标签: cordovaionicangularh5前端angular2    
               
全栈弄潮儿
关注 - 2
粉丝 - 22                
+加关注            
1            
0            
« 上一篇: css4激动人心的新特性及浏览器支持度
» 下一篇: angular3哪儿去了?angular4与2兼容吗    


来自  https://www.cnblogs.com/LVBingo/p/6489227.html

普通分类: