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 相关文章推荐
JQuery 学习笔记 选择器之一
Jul 23 Javascript
很棒的学习jQuery的12个网站推荐
Apr 28 Javascript
jquery实现textarea输入字符控制(仿微博输入控制字符)
Apr 26 Javascript
json数据与字符串的相互转化示例
Sep 18 Javascript
JavaScript实现控制打开文件另存为对话框的方法
Apr 17 Javascript
js实现三张图(文)片一起切换的banner焦点图
Aug 25 Javascript
jQuery实现点击表格单元格就可以编辑内容的方法【测试可用】
Aug 01 Javascript
js如何判断是否在iframe中及防止网页被别站用iframe嵌套
Jan 11 Javascript
微信小程序 合法域名校验出错详解及解决办法
Mar 09 Javascript
echarts大屏字体自适应的方法步骤
Jul 12 Javascript
element-ui树形控件后台返回的数据+生成组织树的工具类
Mar 05 Javascript
JavaScript onclick事件使用方法详解
May 15 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
防止MySQL注入或HTML表单滥用的PHP程序
2009/01/21 PHP
PHP 裁剪图片成固定大小代码方法
2009/09/09 PHP
php判断字符串在另一个字符串位置的方法
2014/02/27 PHP
php按百分比生成缩略图的代码分享
2014/05/10 PHP
详解PHP实现定时任务的五种方法
2016/07/25 PHP
PHP依赖注入(DI)和控制反转(IoC)详解
2017/06/12 PHP
js不是基础的基础
2006/12/24 Javascript
javascript的trim,ltrim,rtrim自定义函数
2008/09/21 Javascript
jQuery 定时局部刷新(setInterval)
2010/11/19 Javascript
Javascript中的this绑定介绍
2011/09/22 Javascript
jquery 使用简明教程
2014/03/05 Javascript
jQuery实现按钮只点击一次后就取消点击事件绑定的方法
2015/06/26 Javascript
JavaScript中0和""比较引发的问题
2016/05/26 Javascript
jQuery输入框密码的显示隐藏【代码分享】
2017/04/29 jQuery
基于模板引擎Jade的应用(详解)
2017/12/12 Javascript
vue iView 上传组件之手动上传功能
2018/03/16 Javascript
JS实现匀速与减速缓慢运动的动画效果封装示例
2018/08/27 Javascript
jQuery添加新内容的四个常用方法分析【append,prepend,after,before】
2019/03/19 jQuery
JS简单表单验证功能完整示例
2020/01/26 Javascript
Vue实现附件上传功能
2020/05/28 Javascript
详解js创建对象的几种方式和对象方法
2021/03/01 Javascript
[42:52]Optic vs Serenity 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
Python 命令行非阻塞输入的小例子
2013/09/27 Python
python2.7安装图文教程
2018/03/13 Python
python用户评论标签匹配的解决方法
2018/05/31 Python
Python XML转Json之XML2Dict的使用方法
2019/01/15 Python
Python-Tkinter Text输入内容在界面显示的实例
2019/07/12 Python
Python基于wordcloud及jieba实现中国地图词云图
2020/06/09 Python
CSS3教程(8):CSS3透明度指南
2009/04/02 HTML / CSS
跑鞋、网球鞋、网球拍、服装及装备:Holabird Sports
2016/09/19 全球购物
护理专业毕业生自我鉴定总结
2014/03/24 职场文书
优秀班主任工作总结2015
2015/05/25 职场文书
网络舆情信息简报
2015/07/21 职场文书
Python基础知识之变量的详解
2021/04/14 Python
postman中form-data、x-www-form-urlencoded、raw、binary的区别介绍
2022/01/18 HTML / CSS
带你了解Java中的ForkJoin
2022/04/28 Java/Android