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的消息提示插件之旅 DivAlert(三)
Apr 01 Javascript
浏览器常用高宽的jquery插件
Feb 24 Javascript
高效的获取当前元素是父元素的第几个子元素
Oct 15 Javascript
深入探讨前端框架react
Dec 09 Javascript
ES6中Array.includes()函数的用法
Sep 20 Javascript
微信小程序获取手机号授权用户登录功能
Nov 09 Javascript
Angular4.x Event (DOM事件和自定义事件详解)
Oct 09 Javascript
用Golang运行JavaScript的实现示例
Nov 25 Javascript
Vue基础配置讲解
Nov 29 Javascript
JS实现滑动插件
Jan 15 Javascript
vue scroll滚动判断的实现(是否滚动到底部、滚动方向、滚动节流、获取滚动区域dom元素)
Jun 11 Javascript
详解vite2.0配置学习(typescript版本)
Feb 25 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中通过curl smtp发送邮件
2012/06/05 PHP
php中explode与split的区别介绍
2012/10/03 PHP
PHP上传文件时文件过大$_FILES为空的解决方法
2013/11/26 PHP
PHP中使用虚代理实现延迟加载技术
2014/11/05 PHP
PHP序列化操作方法分析
2016/09/28 PHP
PHP实现随机生成水印图片功能
2017/03/22 PHP
超级兔子让浮动层消失的前因后果
2007/03/09 Javascript
关于javascript DOM事件模型的两件事
2010/07/22 Javascript
如何用JavaScript动态呼叫函数(两种方式)
2013/05/03 Javascript
如何使Chrome控制台支持多行js模式——意外发现
2013/06/13 Javascript
一个JavaScript的求爱小特效
2014/05/09 Javascript
JavaScript中使用指数方法Math.exp()的简介
2015/06/15 Javascript
通过设置CSS中的position属性来固定层的位置
2015/12/14 Javascript
JavaScript中splice与slice的区别
2017/05/09 Javascript
小程序如何构建骨架屏
2019/05/29 Javascript
vue-cli随机生成port源码的方法
2019/09/02 Javascript
vue 路由子组件created和mounted不起作用的解决方法
2019/11/05 Javascript
JS如何寻找数组中心索引过程解析
2020/06/01 Javascript
讲解Python中fileno()方法的使用
2015/05/24 Python
django输出html内容的实例
2018/05/27 Python
Sanic框架请求与响应实例分析
2018/07/16 Python
python: 判断tuple、list、dict是否为空的方法
2018/10/22 Python
解决在Python编辑器pycharm中程序run正常debug错误的问题
2019/01/17 Python
Python Scrapy框架:通用爬虫之CrawlSpider用法简单示例
2020/04/11 Python
CSS3+JavaScript实现炫酷呼吸效果的示例代码
2020/06/15 HTML / CSS
俄罗斯达美乐比萨外送服务:Domino’s Pizza
2020/12/18 全球购物
静态变量和实例变量的区别
2015/07/07 面试题
前台文员岗位职责及工作流程
2013/11/19 职场文书
离婚协议书怎么写(范本参考)
2014/09/30 职场文书
党员查摆四风问题思想汇报
2014/10/25 职场文书
2014年个人业务工作总结
2014/11/17 职场文书
通报表扬范文
2015/01/17 职场文书
2016年教师党员公开承诺书
2016/03/24 职场文书
pytorch显存一直变大的解决方案
2021/04/08 Python
JavaScript使用canvas绘制坐标和线
2021/04/28 Javascript
element多个表单校验的实现
2021/05/27 Javascript