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 最简单易用的表单验证插件
Feb 27 Javascript
Extjs4.0设置Ext.data.Store传参的请求方式(默认为GET)
Apr 02 Javascript
jQuery中filter()和find()的区别深入了解
Sep 25 Javascript
js中判断变量类型函数typeof的用法总结
Aug 09 Javascript
js拖拽功能实现代码解析
Nov 28 Javascript
Bootstrap 表单验证formValidation 实现远程验证功能
May 17 Javascript
Angular实现表单验证功能
Nov 13 Javascript
vue中子组件调用兄弟组件方法
Jul 06 Javascript
微信小程序有旋转动画效果的音乐组件实例代码
Aug 22 Javascript
详解关于React-Router4.0跳转不置顶解决方案
May 10 Javascript
VUE实现移动端列表筛选功能
Aug 23 Javascript
浅谈Vue2.4.0 $attrs与inheritAttrs的具体使用
Mar 08 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
全国FM电台频率大全 - 17 湖北省
2020/03/11 无线电
可以在线执行PHP代码包装修正版
2008/03/15 PHP
php入门学习知识点七 PHP函数的基本应用
2011/07/14 PHP
PHP5中实现多态的两种方法实例分享
2014/04/21 PHP
PHP实现服务器状态监控的方法
2014/12/09 PHP
php自定义函数转换html标签示例
2016/09/29 PHP
IE和firefox浏览器的event事件兼容性汇总
2009/12/06 Javascript
JavaScript Accessor实现说明
2010/12/06 Javascript
为超链接加上disabled后的故事
2010/12/10 Javascript
jQuery-Tools-overlay 使用介绍
2012/07/14 Javascript
没有document.getElementByName方法
2013/08/19 Javascript
javascript定义变量时带var与不带var的区别分析
2015/01/12 Javascript
详细介绍jQuery.outerWidth() 函数具体用法
2015/07/20 Javascript
AngularJs Javascript MVC 框架
2016/06/20 Javascript
原生js实现电商侧边导航效果
2017/01/19 Javascript
手把手教你搭建ES6的开发运行环境
2017/07/11 Javascript
jquery 通过ajax请求获取后台数据显示在表格上的方法
2018/08/08 jQuery
浅谈Angular单元测试总结
2019/03/22 Javascript
基于vue框架手写一个notify插件实现通知功能的方法
2019/03/31 Javascript
微信小程序实现加入购物车滑动轨迹
2020/11/18 Javascript
python线程锁(thread)学习示例
2013/12/04 Python
Python魔术方法详解
2015/02/14 Python
python实现机器学习之元线性回归
2018/09/06 Python
Python3爬楼梯算法示例
2019/03/04 Python
python SVM 线性分类模型的实现
2019/07/19 Python
在django模板中实现超链接配置
2019/08/21 Python
如何解决django-celery启动后迅速关闭
2019/10/16 Python
Python笔记之工厂模式
2019/11/20 Python
基于Python的OCR实现示例
2020/04/03 Python
python算的上脚本语言吗
2020/06/22 Python
Python如何爬取b站热门视频并导入Excel
2020/08/10 Python
HTML5之消息通知的使用(Web Notification)
2018/10/30 HTML / CSS
2014年人民警察入党思想汇报
2014/10/12 职场文书
学校群众路线专项整治方案
2014/10/31 职场文书
群众路线自查报告及整改措施
2014/11/04 职场文书
2014年大学教师工作总结
2014/12/02 职场文书