1 创建项目

  1.1 版本说明

    

    

  1.2 创建模块

    1.2.1 核心模块

      该模块只加载一次,主要存放一些核心的组件及服务

      ng g m core

      1.2.1.1 创建一些核心组件

        页眉组件:header

          ng g c core/header --module core

        内容组件:main

          ng g c core/main --module core

        页脚组件:footer

          ng g c core/footer --module core

      1.2.1.2 如何让核心模块只加载一次

        在核心模块对应类中的构造器中增添如下代码

  constructor( @Optional() @SkipSelf() parent: CoreModule) {
if (parent) {
throw new Error('核心模块已经加载了,请勿重复加载');
}
}
import { NgModule,  SkipSelf, Optional } from '@angular/core';
import { CommonModule } from '@angular/common';
import { HeaderComponent } from './header/header.component';
import { MainComponent } from './main/main.component';
import { FooterComponent } from './footer/footer.component'; @NgModule({
imports: [
CommonModule
],
declarations: [
HeaderComponent,
MainComponent,
FooterComponent
],
exports: [
HeaderComponent,
MainComponent,
FooterComponent
]
})
export class CoreModule {
constructor( @Optional() @SkipSelf() parent: CoreModule) {
if (parent) {
throw new Error('核心模块已经加载了,请勿重复加载');
}
}
}

        代码解释:

          @SkipSelf() -> 该注解的作用是告诉应用在进行依赖注入时要排除自身(即:不想从当前元素获取依赖),这样注入器就会从一个在自己 上一级 的组件开始搜索一个CoreModule依赖;如果不添加时就会出现解析错误:

            

          @Optional() -> 该注解的作用是保证依赖找不到时报错,当CoreModule不存在时就进行了依赖注入就会报错;当无法确保依赖是否存在的情况下,而又为了避免抛出找不到依赖的错误情况,可以使用@Optional()注解,这样该依赖是可选的,此处我们是为了保证都次导入核心模块时不依赖注入CoreModule;如果不添加就会出现实例找不到的错误:

            

    1.2.2 共享模块

      该模块可以多次加载,将一些公用的组件和模块放到该模块下并做导出操作

      ng g m shared

  1.3 构建应用大体结构

    利用flex布局实现三段式布局,flex布局详解

    1.3.1 模块导入

      在主模块中导入核心模块和共享模块

      

    1.3.2 重构主组件     

<div class="site">
<header>
<app-header></app-header>
</header>
<main>
<app-main></app-main>
</main>
<footer>
<app-footer></app-footer>
</footer>
</div>

      坑01:虽然已经在主模块中导入了核心模块,但是在主模块中的所有组件只可以用核心模块中导出的东西

      技巧01:在核心模块中导出主模块中需要用到的三个组件  

        

import { NgModule,  SkipSelf, Optional } from '@angular/core';
import { CommonModule } from '@angular/common';
import { HeaderComponent } from './header/header.component';
import { MainComponent } from './main/main.component';
import { FooterComponent } from './footer/footer.component'; @NgModule({
imports: [
CommonModule
],
declarations: [
HeaderComponent,
MainComponent,
FooterComponent
],
exports: [
HeaderComponent,
MainComponent,
FooterComponent
]
})
export class CoreModule {
constructor( @Optional() @SkipSelf() parent: CoreModule) {
if (parent) {
throw new Error('核心模块已经加载了,请勿重复加载');
}
}
}

    1.3.3 添加全局样式

      在全局样式中利用flex布局实现主组件的三段式布局

html, body, app-root, mat-sidenav-container, .site {
width: 100%;
height: 100%;
margin:;
} .site {
display: flex;
flex-direction: column;
} header {
background-color: skyblue;
} main {
background-color: grey;
flex: auto;
} footer {
background-color: skyblue;
}

    1.3.4 效果展示

      

2 @angular/material使用

  2.1 安装 material 和 cdk

    @angular/cdk -> ng 对于 ui 组建的基础架构,是由 material 团队开发与维护的, 之所以会有 cdk 看样子是因为在开发 material 的时候随便抽象一个层次出来给大家用。

npm install --save @angular/material @angular/cdk

    技巧01:推荐使用cnpm安装

  2.2 安装 animations

    一些 material 组件需要依赖 @angular/animations 来实现动画跳转

npm install --save @angular/animations

    技巧01:仅仅安装 @angular/animations 是没有用的,还需要在核心模块或者是主模块中导入BrowserAnimationsModule或者NoopAnimationsModule

      

import { BrowserModule } from '@angular/platform-browser';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { NgModule } from '@angular/core'; import { AppComponent } from './app.component';
import { TestModule } from './test/test.module';
import { CoreModule } from './core/core.module';
import { SharedModule } from './shared/shared.module'; @NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
BrowserAnimationsModule,
CoreModule,
SharedModule,
TestModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }

  2.3 引入material内置主题

    在全局演示用利用 @import 引入

@import '~_@angular_material@5.2.2@@angular/material/prebuilt-themes/deeppurple-amber.css';

  2.4 手势支持

    由于material是一个支持多种设备终端的组件库,为了支持一些移动端设备material组件用到了HammerJS,如果没有HammerJS就可能出现某些移动端不能正常显示

cnpm install --save hammerjs

    技巧01:仅仅安装hammerjs还不行,还需要在核心模块或者主模块中引入

import 'hammerjs';

    

import { NgModule,  SkipSelf, Optional } from '@angular/core';
import { CommonModule } from '@angular/common';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { HeaderComponent } from './header/header.component';
import { MainComponent } from './main/main.component';
import { FooterComponent } from './footer/footer.component'; import 'hammerjs'; @NgModule({
imports: [
CommonModule,
BrowserAnimationsModule
],
declarations: [
HeaderComponent,
MainComponent,
FooterComponent
],
exports: [
HeaderComponent,
MainComponent,
FooterComponent
]
})
export class CoreModule {
constructor( @Optional() @SkipSelf() parent: CoreModule) {
if (parent) {
throw new Error('核心模块已经加载了,请勿重复加载');
}
}
}

3 MatSidenavModule的使用

  3.1 导入MatSidenavModule

    在共享模块中导入并导出MatSidenavModule

    

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import {
MatSidenavModule
} from '@angular/material'; @NgModule({
imports: [
CommonModule,
MatSidenavModule
],
declarations: [],
exports: [
MatSidenavModule
]
})
export class SharedModule { }

  3.2 使用MatSidenavModule中的组件

    使用MatSidenavModule中的组件实现侧边栏效果

    

<mat-sidenav-container>
<mat-sidenav #sidenav>
<p>hello boy</p>
</mat-sidenav> <div class="site">
<header>
<app-header></app-header>
</header>
<main>
<button (click)="sidenav.open()">点击划出</button>
<app-main></app-main>
</main>
<footer>
<app-footer></app-footer>
</footer>
</div> </mat-sidenav-container>

  3.3 效果展示

    

  3.4 官方文档

    点击前往

      

Material使用11 核心模块和共享模块、 如何使用@angular/material的更多相关文章

  1. Angular Material 的设计之美

    前言 Angular Material 作为 Angular 的官方组件库,无论是设计交互还是易用性都有着极高的质量.正如官方所说其目的就是构建基于 Angular 和 Typescript 的高质量 ...

  2. Angular Material

    Angular Material 的设计之美   Ng-Matero 0.3 已发布,新增 module schematic 以及 page schematic,详见 README 前言 Angula ...

  3. Material使用03 MdCardModule模块、MdInputModule模块

    需求:先需要增加一个登录模块 1 创建登录模块 ng g m testLogin 1.1 将共享模块导入到登录模块中 import { NgModule } from '@angular/core'; ...

  4. VB 核心编程及通用模块开发 笔记1

    前言:学习任何编程语言.编程工具的目的不外乎解决生活问题,能够快速.高效解决问题的方式就是不错的方式,至于选择什么“工具”,众位看官看着办,本人虽然有过3年vb开发经验,但是一直没有深入学习,现已购买 ...

  5. 多线程(三) 实现线程范围内模块之间共享数据及线程间数据独立(ThreadLocal)

    ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.JDK 1.2的版本中就提供java.lang.ThreadLocal,使用这个工具类可以很简洁地编写出优美的多线程程序,Threa ...

  6. Angular项目中共享模块的实现

    创建share Modele:ng g m share import进来所有需要共享的模块都export出去, 一.共享CommonModule 暂时只有CommonModule,以后会有一些需要共享 ...

  7. 多线程(四) 实现线程范围内模块之间共享数据及线程间数据独立(Map集合)

    多个线程访问共享对象和数据的方式 1.如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. 2.如果每个线程执行的代码 ...

  8. 洗礼灵魂,修炼python(11)--python函数,模块

    前面的章节你如果看懂了,基本算是入门了七八了,不过如果你以为python就这么点东西,你觉得很简单啊,那你就错了,真正的东西在后面,前面我说的几大核心其实也不是多么高深多么厉害的,那些东西是基础很常用 ...

  9. 怎么把html页面中共用的底部代码做成共享模块

    问: 很多时候,我们在设计网站时会发现,站内每一个页面的header跟footer其实都是一样的,如果每个页面都写header跟footer就会显示代码冗余而且维护也不方便, 这时候最好的做法就是把相 ...

随机推荐

  1. radiobutton独特属性

    radiobutton是通过name来分组的,也就是说,使用相同的名字的radio,它们才是单选的,如果名字不同的radio,是不具备这个效果的,这个是第一要点. 第二,针对不同的radio(name ...

  2. Netty5序章之BIO NIO AIO演变

    Netty5序章之BIO NIO AIO演变 Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能.高可靠的网络服务器和客户端程序.Netty简化了网络程序的开发,是很多框架和公司都在使 ...

  3. bat复制文件夹下所有文件到另一个目录

    一个需求,网上了半天都是错了,所以记一下吧,方便你我. copy是文件拷贝,文件夹拷贝需要用到xcopy @echo off::当前盘符set curPath=%cd%set digPath =&qu ...

  4. Java | 原来 try 还可以这样用啊?!

    本文首发于 http://youngzy.com/ 习惯了这样的try: try { } catch (Exception e) { } 看到了这样的try,觉得有点神奇: try(...) { } ...

  5. 注释中不允许出现字符串 "--"。

    问题: 在启动tomcat时会出现如上错误,同时有可能会出现xml无法解析等错误 解决办法: 注释中不能出现字符串 "--",即需要把xml文件中多余的“--”去掉,例如: < ...

  6. oracle03

    (1)表中数据操作 插入数据: a.插入单条 insert into myemp(empno,ename) values(1111,'张三'); b.批量插入 insert into myemp se ...

  7. Centos7-卸载自带的jdk 安装jdk8

    卸载JDK Centos7一般都会带有自己的openjdk,我们一般都回用oracle的jdk,所以要卸载 步骤一:查询系统是否以安装jdk #rpm -qa|grep java 或    #rpm ...

  8. Linux指令--kill

    Linux中的kill命令用来终止指定的进程(terminate a process)的运行,是Linux下进程管理的常用命令.通常,终止一个前台进程可以使用Ctrl+C键,但是,对于一个后台进程就须 ...

  9. DOM4J使用简介

    Dom4j 使用简介 作者:冰云 icecloud(AT)sina.com 时间:2003.12.15   版权声明: 本文由冰云完成,首发于CSDN,未经许可,不得使用于任何商业用途. 文中代码部分 ...

  10. 浅谈Await

    1.Await为什么不会导致堵塞 我们都知道Await关键字是.Net FrameWork4.5引入的特性.await使得我们使用异步更加时特别便捷,并且还不会导致线程堵塞.我们在使用时也就莫名其妙的 ...