Angular2  NgModule 模块详解


Posted in Javascript onOctober 19, 2016

Angular的模块的目的是用来组织app的逻辑结构。

在ng中使用@NgModule修饰的class就被认为是一个ng module。NgModule可以管理模块内部的Components、Directives、Pipes,引入Service,并控制外部组件对内部成员的访问权限。

angular2 具有了模块的概念,响应了后台程序的号召,高内聚 低耦合。模块就是用来进行封装,进行高内聚  低耦合的功能。

其实各人认为ng2 的模块和.net的工程类似,如果要使用模块中定义的功能,第一步就是必须要引用它,ng2 中叫import 导入。

那么我们看模块是否有层级概念呢,至少目前来看,模块都是平级的,没有主子之分。

如何定义模块呢?

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

/* App Root */
import { AppComponent } from './app.component';

/* Feature Modules */
import { ContactModule } from './contact/contact.module';
import { CoreModule } from './core/core.module';
import { routing } from './app.routing';
import { Title } from '@angular/platform-browser';
@NgModule({
 imports: [
  BrowserModule,
  ContactModule,
  /*
    CoreModule,
  */
  CoreModule.forRoot({ userName: 'Miss Marple' }),
  routing
 ],
 declarations: [AppComponent],//声明当前模块需要的指定 组件信息
 exports:[],
 providers: [Title],
 bootstrap: [AppComponent]
})
export class AppModule { }

 简单说明一下模块元数据中各个参数的用途。

imports:导入其他模块,就是要使用其他模块的功能,必须要导入。

declarations:声明,声明本模块包含的内容。可能有些同学会遇到,定义了一个指令,在component中使用却总是没有生效的问题,首先我们要检查的就是是否进行了声明。

exports:外部可见的内容。相当于.net中声明为public的那些类。

providers:服务提供者,主要用来定义服务。估计ng2框架会自动将注册的服务体检到依赖注入实例中,目前测试也是如此。

bootstrap:启动模块。只在根模块使用。在除了根模块以外的其他模块不能使用。

2.问题2

目前官方叫法:启动模块为根模块,自定义的其他模块叫特性模块。

我们是否可以在特性模块中import根模块呢?

实验是检验真理的最好方法。

import { NgModule }      from '@angular/core';
import { SharedModule }    from '../shared/shared.module';

import { ContactComponent }  from './contact.component';
import { ContactService }   from './contact.service';
import { routing }      from './contact.routing';
import{GuozhiqiModule}from '../directives/guozhiqi.module';
import{AppModule}from '../app.module';
@NgModule({
 imports:   [ SharedModule, routing,GuozhiqiModule,AppModule ],// 导入模块
 declarations: [ ContactComponent ],//声明 指令 
 providers:  [ ContactService ]//服务提供者 在当前模块提供者中注册当前模块需要的服务
})
export class ContactModule { }

appModule是根模块,我们定义的contactModule是特性模块,现在我们通过imports 导入根模块。

Angular2  NgModule 模块详解

 执行出现错误,contactModule导入了一个undefined的module?

为什么会出现这个问题呢?

各人估计是因为1.导致了循环引用的问题。appModule会加载ContactModule,而在ContactModule中又要import 根模块,导致循环引用,从而出现错误。

2.另一种解释就是根模块不允许导入。ng2框架不允许这样

问题3:如何避免出现循环引用呢?

官方给出了答案:https://angular.cn/docs/ts/latest/guide/ngmodule.html#!#prevent-reimport

constructor (@Optional() @SkipSelf() parentModule: CoreModule) {
  if (parentModule) {
   throw new Error(
    'CoreModule is already loaded. Import it in the AppModule only');
  }
 }

 但是我本地验证并不会有效的验证如何避免重复import一个模块。

问题4. 模块与路由的关系。

Angular2  NgModule 模块详解

基本上每个特性模块都有单独的路由定义,关于模块和路由的关系定义,下次说到ng2路由时再细说,因为ng2的路由太强大,以至于需要很长时间的理解才能明白。

ng2模块的目录和目录结构的最佳实践:

1.每个模块一个单独的文件夹

2.模块是高内聚 低耦合

3.模块内功能相关或相近

4.每个模块都有单独的路由定义 -不是必须

5.不要重复导入一些模块,必要的时候加入限制。 因为重复导入可能会影响依赖注入实例

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
javascript中类的定义及其方式(《javascript高级程序设计》学习笔记)
Jul 04 Javascript
Js放到HTML文件中的哪个位置有什么区别
Aug 21 Javascript
Jquery增加鼠标中间功能mousewheel的实例代码
Sep 05 Javascript
JavaScript代码简单实现求杨辉三角给定行的最大值
Oct 29 Javascript
JS 删除字符串最后一个字符的实现代码
Feb 20 Javascript
Bootstrap table表格简单操作
Feb 07 Javascript
详解ElementUI之表单验证、数据绑定、路由跳转
Jun 21 Javascript
Material(包括Material Icon)在Angular2中的使用详解
Feb 11 Javascript
用node.js写一个jenkins发版脚本
May 21 Javascript
js实现时分秒倒计时
Dec 03 Javascript
小程序表单认证布局及验证详解
Jun 19 Javascript
JavaScript数组reduce()方法的语法与实例解析
Jul 07 Javascript
JS自定义函数对web前端上传的文件进行类型大小判断
Oct 19 #Javascript
jQuery  ready方法实现原理详解
Oct 19 #Javascript
Javascript实现汉字和拼音互转的终极方案
Oct 19 #Javascript
Javascript typeof与instanceof的区别
Oct 18 #Javascript
javascript self对象使用详解
Oct 18 #Javascript
jQuery动态添加与删除tr行实例代码
Oct 18 #Javascript
Jquery表单验证失败后不提交的解决方法
Oct 18 #Javascript
You might like
Php中使用Select 查询语句的实例
2014/02/19 PHP
两个php日期控制类实例
2014/12/09 PHP
新浪SAE搭建PHP项目教程
2015/01/28 PHP
PHP借助phpmailer发送邮件
2015/05/11 PHP
java解析json方法总结
2019/05/16 PHP
jQuery提交多个表单的小例子
2013/06/30 Javascript
jQuery构造函数init参数分析续
2015/05/13 Javascript
深入浅析AngularJS中的module(模块)
2016/01/04 Javascript
原生js和jquery分别实现横向导航菜单效果
2016/05/13 Javascript
JavaScript检测原始值、引用值、属性
2016/06/20 Javascript
浅谈javascript中遇到的字符串对象处理
2016/11/18 Javascript
bootstrap快速制作后台界面
2016/12/05 Javascript
微信小程序实现移动端滑动分页效果(ajax)
2017/06/13 Javascript
Vue父子组建的简单通信之控制开关Switch的实现
2018/06/04 Javascript
vue实现城市列表选择功能
2018/07/16 Javascript
深入解析ES6中的promise
2018/11/08 Javascript
超简单的微信小程序轮播图
2019/11/22 Javascript
vue-cli4.0多环境配置变量与模式详解
2020/12/30 Vue.js
Django集成celery发送异步邮件实例
2019/12/17 Python
Numpy实现卷积神经网络(CNN)的示例
2020/10/09 Python
基于Python中Remove函数的用法讨论
2020/12/11 Python
css3的过滤效果简单实例
2016/08/03 HTML / CSS
HTML5 Canvas实现平移/放缩/旋转deom示例(附截图)
2013/07/04 HTML / CSS
浅谈HTML5 & CSS3的新交互特性
2016/07/19 HTML / CSS
发现世界上最好的珠宝设计师:JewelStreet
2017/12/17 全球购物
英国复古服装和球衣购买网站:3Retro Football
2018/07/09 全球购物
加拿大著名的奢侈品购物网站:SSENSE(支持中文)
2020/06/25 全球购物
UDP协议功能
2013/01/06 面试题
公司市场专员岗位职责
2014/06/29 职场文书
销售内勤岗位职责范本
2015/04/13 职场文书
2015年食堂工作总结报告
2015/04/23 职场文书
倡议书的格式写法
2015/04/28 职场文书
英语教学课后反思
2016/02/15 职场文书
如何用python反转图片,视频
2021/04/24 Python
Java面试题冲刺第十七天--基础篇3
2021/08/07 面试题
Win11如何修改dns?Win11修改dns图文教程
2022/01/18 数码科技