Angular 2 NgModule vs Angular 1 module

news/2023/12/9 17:31:32

一直想写关于 Angular 1.x 与 Angular 2.x (Angular 4.x 已发布) 区别的文章,方便 Angular 1.x 的用户快速的过渡到 Angular 2.x。在浏览文章的时候,发现 Todd Motto 大神,已经写了相关的系列文章。英文好的同学,建议直接阅读 From angular.module to ngModule 原文哈,因为我并不打算完整地翻译。废话不多说,接下来我们开始进入正题。

目录

  • Angular 1.x

    • Root Module

    • Child Module

  • Angular 2

    • Root Component

    • Child Component

Angular 1.x

Angular 1.x 在框架层面上大量依赖模块的支持,模块为我们提供了更好的方式去组织应用程序。

Root Module

在 Angular 1.x 应用程序启动的时候,它会启动入口文件通过 ng-app 指令声明的根组件。在 Angular 1.x 中我们通过 angular.module() API 来创建模块。 angular.module 的签名如下:

angular.module(name, [requires], [configFn]);

参数说明:

  • name: string - 创建或获取的模块名称

  • requires: [] (可选) - 设置该模块依赖的模块列表

  • configFn: Function (可选) - 用来配置模块

当调用 angular.module() 时,设置的参数个数大于1时,表示我们想创建一个新的模块:

angular.module('app', []); // This is a setter

当调动 angular.module() 时,只传入一个参数,表示我们想获取参数对应的模块:

angular.module('app'); // This is a getter

接下来我们来创建根模块及App组件:

const AppComponent = {
  template: `
    <h1>Root Component</h1>
  `
};

angular
  .module('app', []) // 创建根模块
  .component('app', AppComponent); // 创建App组件

为了引导 Angular 1.x 应用程序的启动,我们必须在主入口文件(通常为index.html) 文件的 body 标签中添加 ng-app="app"。此外,在 body 标签内,还还需要初始化 AppComponent,即添加我们的自定义指令 app 到 body 中。具体如下:

<body ng-app="app">
  <app></app>
</body>

Child Module

随着应用程序越来越庞大,考虑系统的可维护行和可扩展性,我们可以按功能对系统进行切割,划分出各个特性模块。即使用 angular.module() 定义出各个子模块。假设系统中有一个联系模块,我们可以把该模块独立成子模块。具体如下:

const ContactsComponent = {
  template: `
    <h3>Contacts go here.</h3>
  `
};

angular
  .module('contacts', [])
  .component('contacts', ContactsComponent);

创建完子模块,我们需要在根模块中导入,才能保证系统能正常运行。具体如下:

angular
  .module('app', ['contacts']) // 第二个参数:声明依赖的模块名称
  .component('app', AppComponent); // 定义AppComponent组件

在根模块导入 contacts 模块后,我们需要更新 AppComponent 组件中的模板,以包含 contacts 模块中创建的联系人组件:

const AppComponent = {
  template: `
    <h1>Root Component</h1>
    <contacts></contacts>
  `
};

angular
  .module('app', ['contacts'])
  .component('app', AppComponent);

Angular 2

Angular 2 在 RC5 中引入了 @NgModule 类装饰器,帮我们把应用组织成多个内聚的功能块。Angular 模块是带有 @NgModule 装饰器函数的类。 @NgModule接收一个元数据对象,该对象告诉 Angular 如何编译和运行模块代码。 它标记出该模块拥有的组件、指令和管道, 并把它们的一部分公开出去,以便外部组件使用它们。 它可以向应用的依赖注入器中添加服务提供商。 本章还会涉及到更多选项。

Angular 2 应用程序,是由组件构成,即整个应用程序是一颗组件树。接下来我们先来创建根组件,随后在创建根模块。

Root Component

app.component.ts

import { Component } from '@angular/core'; // 导入核心模块中的Component装饰器

@Component({ // 定义组件相关的metadata信息
  selector: 'app', // 用于定义组件在HTML代码中匹配的标签
  template: ` // 为组件指定一个内联的模板
    <h1>Root Component</h1>
  `
})
export class AppComponent {}

使用 @NgModule() 创建根组件:

app.module.ts

import {NgModule} from '@angular/core';
import {BrowserModule} from '@angular/platform-browser';
import {AppComponent} from './app.component';

@NgModule({
    imports: [BrowserModule], // 导入依赖的模块
    bootstrap: [AppComponent], // 设置启动入口根组件
    declarations: [AppComponent] // 声明AppComponent组件
})
export class AppModule {}

接下来创建 main.ts 文件:

main.ts

// main.ts
import {platformBrowserDynamic} from '@angular/platform-browser-dynamic';
import {AppModule} from './app.module';

platformBrowserDynamic().bootstrapModule(AppModule);

最后在主入口文件(通常为index.html) 文件,添加我们创建的 app 自定义元素。

<body>
  <app>
    loading...
  </app>
</body>

Child Component

定义 contacts 子组件:

contact.component.ts

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

@Component({
  selector: 'contacts',
  template: `
    <h3>
      Contacts go here.
    </h3>
  `
})
export class ContactsComponent { }

在 AppModule 组件导入 ContactsComponent 组件:

app.module.ts

import {NgModule} from '@angular/core';
import {BrowserModule} from '@angular/platform-browser';
import {AppComponent} from './app.component';
import {ContactsComponent} from './contacts.component';

@NgModule({
  imports: [BrowserModule],
  bootstrap: [AppComponent],
  declarations: [AppComponent, ContactsComponent]
})
export class AppModule {}

接下来更新 AppComponent 组件,应用我们新创建的 ContactsComponent 组件:

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

@Component({
  selector: 'app',
  providers: [],
  template: `
    <h1>Root Component</h1>
    <contacts></contacts>
  `
})
export class AppComponent {}

我有话说

1.在 Angular 2 中除了根模块之外还包含其它什么模块及模块还有哪些相关知识及注意事项?

在 Angular 2 中除了根模块(RootModule)之外,常见的还有共享模块(ShareModule)、核心模块(CoreModule) 、特性模块(FeatureModule) 等。

详细内容请参考 - Angular 模块


http://www.niftyadmin.cn/n/3540898.html

相关文章

海量高性能列式数据库HiStore介绍

HiStore是阿里中间件技术团队研发的数据库产品&#xff0c;是一款基于独特的知识网格技术的列式数据库&#xff0c;定位于海量数据高压缩比列式存储&#xff0c;是低存储成本&#xff0c;低维护成本&#xff0c;海量数据OLAP存储引擎&#xff1b;有效的解决了海量数据存储的成本…

鸿蒙--笔记

初始化搜索库数据http://so.chci.cn/createIndex4ChciInfo.vhtm?infoTypepics&#xff08;news&#xff09; 分页随笔 reqBuilder.setFrom((param.getPageNo() - 1) * param.getPageSize()); 20170406 想法&#xff1a; 解耦思想&#xff1a; 比如需求是根据内容中的图片数量…

04 Django 视图与网址-urls.py

Django中网址是写在 urls.py 文件中&#xff0c;用正则表达式对应 views.py 中的一个函数(或者generic类),我们用一个项目来演示。 一、首先&#xff0c;新建一个项目(project) 参见03 二、新建一个应用(app) 参见03 完成之后的框架如图&#xff1a; 三、参数设置 1、把我们新定…

Linux stress CPU的测试方法

一、stress工具安装&#xff1a;1、获取stress源码安装包&#xff08;stress-1.0.4.tar.gz&#xff09;3、解压并安装 [rootlocalhost /]#cd /tmp/ [rootlocalhost tmp]#tar –zxvf stress-1.0.4.tar.gz 4、进入stress-1.0.4文件夹下&#xff0c;编译并安装stress [rootlocalho…

Centos7 从零编译配置Memcached

2019独角兽企业重金招聘Python工程师标准>>> Memcached 是一个高性能的分布式内存对象缓存系统&#xff0c;用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数&#xff0c;从而提高动态、数据库驱动网站的速度。 Memcached基于…

20155301 2016-2017-2 《Java程序设计》第7周学习总结

20155301 2016-2017-2 《Java程序设计》第7周学习总结 教材学习内容总结 1.例如 Compartor<String>byLengthnew Comparator<String>(){public int compare(String name1,String name2){return name1.length()-name2.length();}} JDK8提供了方法参考的特性&#xff…

老男孩教育每日一题:2017年3月15日-setacl授权相关的两个小题

如果有两个用户tom和 jerrry&#xff0c;tom用户将相应管理的目录设置为共享权限&#xff0c;jerry是否可以进行访问如果jerry如何进行访问&#xff1f;提示&#xff1a;不能用root用户权限&#xff0c;因为root用户在企业中不一定谁都可以有权限使用FACL: FilesystemAccess Co…

最简单靠谱的vsftpd安装指南(Ubuntu16.04)

vsftp &#xff08;very secure FTP daemon&#xff09;意为非常安全的ftp进程 特点&#xff1a;小巧&#xff5c;免费 &#xff5c; 安全&#xff0c;是Linux下最受推崇的ftp服务 安装ftp前要了解&#xff1a;ftp的账户是主机Linux的一个账户&#xff0c;所以最好了解一些Linu…

Maven内置变量

2019独角兽企业重金招聘Python工程师标准>>> ${basedir} 项目根目录 ${project.build.directory} 构建目录&#xff0c;缺省为target ${project.build.outputDirectory} 构建过程输出目录&#xff0c;缺省为target/classes ${project.build.finalName} 产出物名称&a…

UE工作模式

UE的工作模式 lUE有两种基本的运行模式&#xff1a;空闲模式和连接模式空闲模式&#xff1a;UE处于待机状态&#xff0c;没有业务的存在&#xff0c;UE和UTRAN之间没有连接&#xff0c;UTRAN内没有任何有关此UE的信息&#xff1b;通过非接入层标识如IMSI、TMSI或P-TMSI等标志来…

单模和多模光纤的区别是什么?

光纤是一种由挤压的玻璃或塑料制成的柔韧的透明纤维&#xff0c;略粗于人的头发。光纤是两端传输光最常用的一种手段&#xff0c;并广泛地应用于光纤通信中。光纤有着比有线电缆更长的传输距离和更高的带宽。光纤通常由低折射率的透明纤芯和透明包层材料组成。光纤作为光波导体…

Cosmos开篇--C#开源操作系统学习系列一

为什么80%的码农都做不了架构师&#xff1f;>>> cosmos简介 cosmos全称C# open source manage operation system&#xff0c;是一个使用C#语言基于.net framwark框架编写的开源操作系统&#xff0c;主页www.gocosmos.org。可从cosmos.codeplex.com获取最新的源代码…

ATM技术原理

1 术语、定义和缩略语 1.1 术语、定义 B-ISDN参考模型术语/定义 说 明 ATM层 位于B-ISDN/ATM网络协议参考模型的第二层&#xff0c;完成交换、路由选择和信元复用功能。ATM层的基本处理单位是信元。 AAL层 位于B-ISDN/ATM网络信元参考模型的第三层&#xff0c;完…

APS--PTN线性保护倒换功能

概要 APS&#xff08;Automatic Protection Switching&#xff09;是一种应用于基于VLAN以太网的线性保护机制。对一个已经配置了APS功能的工作实体上&#xff0c;会预留一个保护实体&#xff0c;当工作实体之间发生信号失效&#xff08;SF&#xff09;或者信号劣化&#xff08…

WPF快速指导12: 线程处理模型

WPF快速指导12&#xff1a; 线程处理模型 本文摘要&#xff1a; 1&#xff1a;理解与UI相关的多线程操作&#xff1b; 2&#xff1a;多个窗口多个线程 3&#xff1a;WPF中的多线程异常 1&#xff1a;理解与UI相关的多线程操作 首先来说说传统Winform。我们知道传统Winform新…

为OLED屏增加GUI支持6:进度条控件

为OLED屏增加GUI支持6&#xff1a;进度条控件 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境&#xff1a; 主机:WIN10 开发环境:MDK5.13 MCU:STM32F103 源代码&#xff1a; gui_widget_progbar.h [cpp] view plaincopy/** * Copyright (c), 2015-2025…
最新文章