Angular4.0 探索子路由和懒加载 loadChildren
参考文章:
Angular4路由快速入门 http://www.jianshu.com/p/e72c79c6968e
Angular2文档学习的知识点摘要——Angular模块(NgModule)http://lib.csdn.net/article/angularjs/59697?knId=641
随着需求的增加,项目的功能也渐渐复杂起来。这个时候,需要将项目模块化,将组件、指令和管道打包成内聚的功能块,正好可以探索一下Angular4中的子路由以及模块的懒加载。
之前在开发的时候,已经在根模块实现了简单的路由功能,可以总结为以下三个步骤:
1、在app.module.ts文件中加载路由库,并且在@NgModule中引入RouterModule.forRoot方法,其中,appRoutes是路由数组,它定义了具体的路由规则。
import { RouterModule } from ‘@angular/router‘;
......
@NgModule({
declarations: [......],
imports: [
......,
RouterModule.forRoot(appRoutes),
],
providers: [],
bootstrap: [AppComponent]
})
2、在壳组件中增加导航条,其中routerLink指令指向路由的目标,routerLinkActive为选中的标签增加css样式
<a routerLink="/home" routerLinkActive="active"></a>
3、往壳组件的模板中添加一个router-outlet指令,视图将会被显示在那里
<router-outlet></router-outlet>
现在在这个基础上想要实现子路由以及模块的懒加载,文章Angular4路由快速入门中讲得比较清楚了,这里记录一下在开发过程中我所遇到的一些问题以及注意点。
RouterModule.forRoot() 和 RouterModule.forChild()
RouterModule对象为提供了两个静态的方法:forRoot()和forChild()来配置路由信息。
RouterModule.forRoot()方法用于在主模块中定义主要的路由信息,RouterModule.forChild()与 Router.forRoot()方法类似,但它只能应用在特性模块中。
即根模块中使用forRoot(),子模块中使用forChild()。
子路由
假设在我们 /settings 设置页面下有 /settings/profile 和 /settings/password 两个页面,分别表示个人资料页和修改密码页。setting作为一个独立的功能块,可以将其封装成一个特性模块。它拥有自己独立的路由,profile和password两个页面的路由可以设置成子路由。
import { NgModule } from ‘@angular/core‘;
import { CommonModule } from ‘@angular/common‘;
import { Routes, RouterModule } from ‘@angular/router‘;
export const ROUTES: Routes = [
{
path: ‘‘,
component: SettingsComponent,
children: [
{ path: ‘profile‘, component: ProfileSettingsComponent },
{ path: ‘password‘, component: PasswordSettingsComponent }
]
}
];
@NgModule({
imports: [
CommonModule,//注意这里引入的CommonModule,它的作用后面会专门讲到,这里不引入的话页面会报错
RouterModule.forChild(ROUTES)
],
})
export class SettingsModule {}
在SettingsModule 模块中我们使用forChild()方法,因为SettingsModule不是我们应用的主模块。
另一个主要的区别是我们将 SettingsModule 模块的主路径设置为空路径 (‘‘)。因为如果我们路径设置为 /settings,它将匹配 /settings/settings。通过指定一个空的路径,它就会匹配 /settings 路径。
懒加载:loadChildren
在根模块AppModule中配置setting模块的路由信息:
export const ROUTES: Routes = [
{
path: ‘settings‘,
loadChildren: ‘./settings/settings.module#SettingsModule‘
}
]; @NgModule({
imports: [
BrowserModule,
RouterModule.forRoot(ROUTES)
],
// ...
})
export class AppModule {}
这里使用到了懒加载LoadChildren属性。这里没有将SettingsModule导入到AppModule中,而是通过loadChildren属性,告诉Angular路由依据loadChildren属性配置的路径去加载SettingsModule 模块。这就是模块懒加载功能的具体应用,当用户访问 /settings/** 路径的时候,才会加载对应的 SettingsModule 模块,这减少了应用启动时加载资源的大小。
loadChildren的属性值由三部分组成:
需要导入模块的相对路径
#分隔符
导出模块类的名称
CommonModule模块
之前说到在特性模块中要引入CommonModule模块,我一开始没有注意到要在特性模块中引入,结果在路由的时候页面报错:



core.es5.js:1020 ERROR Error: Uncaught (in promise): Error: Template parse errors:
Can‘t bind to ‘ngClass‘ since it isn‘t a known property of ‘div‘.
Can‘t bind to ‘ngForOf‘ since it isn‘t a known property of ‘p‘.
Property binding ngForOf not used by any directive on an embedded template. Make sure that the property name is spelled correctly and all directives are listed in the "@NgModule.declarations".
Can‘t bind to ‘ngIf‘ since it isn‘t a known property of ‘div‘.
......
类似这种一大堆错误,感觉像是 ‘ngClass‘ ‘ngFor‘ ‘ngIf‘这样的指令都没有定义似的。
检查了好久,发现是因为我在特性模块中没有引入CommonModule,引入之后这些错误就都消失了。
import { CommonModule } from ‘@angular/common‘;
@NgModule({
imports: [
CommonModule,
......
],
})
那么CommonModule模块具体的作用是什么呢?看这篇文章
CommonModule提供了很多应用程序中常用的指令,包括NgIf和NgFor等。更准确地说,NgIf等指令是来自@angular/common的CommonModule中声明的。
我们在根模块AppModule中导入了BrowserModule模块,BrowserModule导入了CommonModule并且重新导出了它。最终的效果是:只要导入BrowserModule就自动获得了CommonModule中的指令。
导入BrowserModule会让该模块公开的所有组件、指令和管道在AppModule下的任何组件模板中直接可用,而不需要额外的繁琐步骤。但是在其它任何模块中都不要导入BrowserModule。特性模块和惰性加载模块应该改成导入CommonModule。它们不需要重新初始化全应用级的提供商。 如果你在惰性加载模块中导入BrowserModule,Angular就会抛出一个错误。

以上就是我在这两天使用Angular子路由和懒加载中遇到的一些问题和总结。
https://blog.csdn.net/xwnxwn/article/details/81908749
Angular4.0 探索子路由和懒加载 loadChildren的更多相关文章
- Webpack探索【16】--- 懒加载构建原理详解(模块如何被组建&如何加载)&源码解读
本文主要说明Webpack懒加载构建和加载的原理,对构建后的源码进行分析. 一 说明 本文以一个简单的示例,通过对构建好的bundle.js源码进行分析,说明Webpack懒加载构建原理. 本文使用的 ...
- Webpack探索【10】--- 懒加载详解
本文主要讲懒加载方面相关内容.
- hibernate的懒加载
WHY? WHAT? HOW? 所谓懒加载(lazy)就是延时加载,延迟加载.即不是不加载,而是在需要的时候才加载. 什么时候用懒加载呢,我只能回答要用懒加载的时候就用懒加载. 至于为什么要用懒加载呢 ...
- vue + vue-lazyload 实现图片懒加载
1.安装 npm i vue-lazyload -S 2.配置 main.js /***图片模板等懒加载 start ***/ import VueLazyload from 'vue-lazyloa ...
- angular4.0懒加载
用angular4.0进行前后端分离已经好几个月了,现在接近了尾声,pc端和移动端.可是却还存在着很多问题,最近这几天一直在研究懒加载问题,因为通过ng build --prod打包后主文件很大,有2 ...
- Angular23 loading组件、路由配置、子路由配置、路由懒加载配置
1 需求 由于Angular是单页面的应用,所以在进行数据刷新是进行的局部刷新:在进行数据刷新时从浏览器发出请求到后台响应数据是有时间延迟的,所以在这段时间就需要进行遮罩处理来提示用户系统正在请求数据 ...
- js不需要知道图片宽高的懒加载方法(经过实际测试,不加宽高仍然是无法正常加载的,设置height:auto,height:100%,仍然显示高度为0)
js不需要知道图片宽高的懒加载方法 懒加载是如何实现的? - 简书https://www.jianshu.com/p/e86c61468285找到一个不需要知道图片宽高的懒加载方法了(经过实际测试,不 ...
- Angular07 路由的工作流程、路由参数、子路由、利用路由加载模块、模块懒加载???
1 Angular路由的工作流程 用户在浏览器输入一个URL -> Angular将获取到这个URL并将其解析成一个UrlTree实例 -> Angular会到路由配置中去寻找并激活与Ur ...
- 在ThinkPHP框架(5.0.24)下引入Ueditor并实现向七牛云对象存储上传图片同时将图片信息保存到MySQL数据库,同时实现lazyload懒加载
这是我花了很多天的时间才得以真正实现的一组需求. 文章后面有完整Demo的GitHub链接. 一. 需求描述 1. 应用是基于ThinkPHP5开发的: 2. 服务器环境是LNMP,PHP版本是7.2 ...
随机推荐
- 让Windows中的文件名支持大小写
背景 最近在Linux官网下载了Linux内核,下载下来的是一个后缀为.tar.xz的压缩包,于是在毫不知情的情况下随随便便解压了,解压过程中出现了很多问题. 其中一个问题就是在Windows下,不区 ...
- centos7.5 安装java11
jdk的下载地址如下: https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html 第一 ...
- 接口自动化--日志类封装(logging)
上篇随笔已经写到了读取Excel类的封装了,下面就写下日志类, 日志类在我们自动化的过程中是十分重要的,在我们的自动化程序出现异常的时候就可以打印日志 下面是我自己封装的日志类 import logg ...
- 性能测试基础---LR参数化相关
性能测试脚本的增强:·参数化·关联·事务·检查点·思考时间·集合点 ·参数化:模拟不同用户的不同请求. ·为什么要做参数化? ·功能:通常来说,系统的某些业务数据具有唯一性的要求. ·性能:一般来说, ...
- Tensorflow简单实践系列(二):张量
在上一节中,我们安装 TensorFlow 并运行了最简单的应用,这节我们熟悉 TensorFlow 中的张量. 张量是 TensorFlow 的核心数据类型.数学里面也有张量的概念,但是 Tenso ...
- 项目Beta冲刺(团队4/7)
项目Beta冲刺(团队) --4/7 作业要求: 项目Beta冲刺(团队) 1.团队信息 团队名 :男上加男 成员信息 : 队员学号 队员姓名 个人博客地址 备注 221600427 Alicesft ...
- web渗透—xss攻击如何防御
1.基于特征的防御 XSS漏洞和著名的SQL注入漏洞一样,都是利用了Web页面的编写不完善,所以每一个漏洞所利用和针对的弱点都不尽相同.这就给XSS漏洞防御带来了困难:不可能以单一特征来概括所有XSS ...
- git 学习笔记 —— 保留/丢弃当前分支修改并切换至其他分支
笔者在本地终端进行 git 工作目录的相关处理时,遇到由于某种情况需要使用 git checkout 命令切换到其他分支的情景.此时,若已经对当前分支做了一定的修改,则直接切换分支时 git 会提示错 ...
- Redis 入门知识点
1.Redis简介 1.1.简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: Redi ...
- iOS 应用逆向工程分析流程图
http://bbs.iosre.com/t/ios/12432