Amgular安裝、外掛安裝、新建元件、元件編寫、雙向繫結、服務、ViewChild、元件間通訊、宣告週期函式、非同步程式設計、路由、模組化實現懶載入
安裝
npm install -g @angular/cli
檢視版本
ng v
建立專案
//在filedir中建立專案,並安裝依賴
ng new filedir
//在filedir中建立專案,不安裝依賴
ng new filedir --skip--install
//安裝依賴
npm install
SRC目錄
-app
app-routing.moodule.ts
app.component.css
app.component.html
app.component.spec.ts
app.component.ts
app.module.ts
-assets//存放靜態資源
-environments
environment.prod.ts
enviroment.ts
favicon.ico
index.html
main.ts
polyfills.ts
test.ts
專案中安裝外掛
1
下載
npm install jquery --save//以jquery為例,bootstrap同理
執行該命令後,會將jquery安裝到node_modules中,並且會修改packge.json檔案,將"jquery"作為鍵,版本號作為值新增到denpencies屬性中
2
將第三方庫引入到專案中
開啟angular.json檔案,將第三方庫的js路徑地址新增到"scripts"屬性下,將第三方庫的css路徑地址新增到"styles"屬性下
3
讓ts檔案能識別外掛中的變數
npm install @types/jquery --save -dev//以jquery為例
4
匯入
//在ts檢視檔案中匯入
import * as $ from "jquery"
/*css中匯入*/
@import "~bootstrap/dist/css/bootstrap.css";
新建元件
ng g component components/nvbar //在app中建立nvbar元件到components資料夾
執行命令後,將會在app中新建一個components資料夾,並將元件建立到該資料夾裡。同時,會修改app.module.ts檔案,匯入該元件,並在declartions屬性下欄位新增新生成的元件名
執行專案
ng serve
執行該命令後專案執行
元件結構
-nvbar//元件資料夾
nvbar.component.css
nvbar.component.html //html模板
nvbar.component.spec.ts
nvbar.component.ts //ts檢視
元件編寫
1
繫結動態屬性
<span [innerHTML]='content'></span><!--content是檢視中宣告的變數-->
渲染後,span標籤裡會填充content的值
2
迴圈
<ul>
<li *ngFor="let item of arr">{ {item} }</li><!--arr是檢視中定義的陣列-->
</ul>
渲染後,這裡將會迭代生成多個li標籤,每個li內將填充arr的一個元素
3
判斷
<p>
<span *ngIf="flag">flag is true</span><!--檢視中flag值為true是渲染這個標籤-->
<span *ngIf="!flag">flag is false</span><!--檢視中flag值為false是渲染這個標籤-->
</p>
4
switch...case...
<div [ngSwitch]="status">
<div *ngSwitchCase=1>status's value is 1</div><!--檢視中status的值是1,渲染這個標籤-->
<div *ngSwitchCase=2>status's value is 2</div>
<div *ngSwitchCase=3>status's value is 3</div>
<div *ngSwitchDefault>status's value is 0</div>
</div>
5
動態樣式
<div [ngClass]="{'orange':true,'red':false}">www.zhanghuan.top</div>
<!--預先在css檔案中定義兩個class,orange和red,這裡會將傳入物件中屬性值為true的屬性作為class新增到該標籤中-->
<div [ngStyle]="{'color': 'red'}">www.zhanghuan.top</div>
<!--這裡直接改變該標籤的style屬性,此處為設定div的color為red-->
6
管道
<div>{ {time|date:'yyyy-MM-dd hh:mm:ss'} }</div>
<!--檢視檔案中time:any=new Date()-->
7
事件
1)點選事件
<!--點選事件-模板-->
<button (click)='run($event)'>執行事件</button><!--注意:要捕捉該事件,這裡的引數必須是$event-->
點選該按鈕後將會呼叫檢視中的run方法,$event是捕捉該事件並傳入run中。檢視裡需要定義run方法,並接收傳過來的引數,event.target將指向該按鈕物件
2)按鈕事件
<!--按鈕事件-模板-->
<input type="text" (keydown)="keydown($event)">
//檢視中部分程式碼
keydown(e:any){
if(e.keyCode==13){//如果點選回車,輸出input裡的值
console.log(e.target.value)
}
}
3)雙向資料繫結
(1)需要配置app.modules.ts
import {FormsModule} from '@angular/forms';//匯入該模組
@NgModule({
imports: [
BrowserModule,
AppRoutingModule,
FormsModule//這裡新增模組名
]
})
(2)具體程式碼
<!--雙向繫結-模板-->
<input type="text" [(ngModel)]="keywords"/>{{keywords}}
輸入文字框的內容將會賦值給keywords這個變數,keywords的值隨著輸入內容的改變而改變。注意:檢視函式中如果不宣告keywords這個變數,也不會報錯
表單中雙向繫結案例
1.模板
<div class="container">
<h1 class="text-center">人員登記系統</h1>
<div class="card">
<div class="card-body">
<form>
<!--文字框-->
<div class="form-group">
<label for="name">姓名</label>
<input type="text" class="form-control" [(ngModel)]="peopleinfo.name" name="name" id="name"><!--注意:不設定name屬性會報錯-->
</div>
<!--單選框-->
<p>性別</p>
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" id="sex0" [(ngModel)]="peopleinfo.sex" name="sex" value="0">
<label class="form-check-label" for="sex0">男</label>
</div>
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" id="sex1" [(ngModel)]="peopleinfo.sex" name="sex" value="1">
<label class="form-check-label" for="sex1">女</label>
</div>
<p></p>
<!--下拉選單-->
<p>城市</p>
<select class="form-control" name="city" [(ngModel)]="peopleinfo.city">
<option *ngFor="let item of citylist">{ {item} }</option>
</select>
<p></p>
<!--核取方塊-->
<p>愛好</p>
<div class="form-check form-check-inline" *ngFor="let item of peopleinfo.hobby;let key=index">
<input class="form-check-input" type="checkbox" name="hobby" [id]="'hobby'+key" [(ngModel)]="item.checked">
<label class="form-check-label" [for]="'hobby'+key">{ {item.title} }</label>
</div>
<p></p>
<!--大文字框-->
<div class="mb-3">
<label for="validationTextarea">備註</label>
<textarea class="form-control" id="validationTextarea" name="mark" required [(ngModel)]="peopleinfo.mark"></textarea>
</div>
</form>
</div>
</div>
</div>
{ {peopleinfo|json} }<!--以json形式展示物件-->
2.檢視中關鍵程式碼
public citylist:any[]=["上海","北京","廣州","深圳"]
public peopleinfo:any={
"name":"",
"sex":"0",
"city":"上海",
"hobby":[
{
"title":"吃飯",
"checked":false
},
{
"title":"睡覺",
"checked":false
},
{
"title":"敲程式碼",
"checked":false
}
],
"mark":""
}
搜尋歷史案例
1.模板
<div class="container">
<div class="card">
<div class="card-body">
<form class="form-inline">
<div class="form-group col-sm-9 col-xs-9 mx-sm-3 mb-2">
<label for="search" class="sr-only">search</label>
<input type="text" class="form-control col-sm-12" name="keywords" (keydown)="getkey($event)" [(ngModel)]="keywords" id="search">
</div>
<button type="submit" (click)="add_history()" class="btn btn-primary mb-2">搜尋</button>
</form>
<hr>
<!--迴圈search_his-->
<h3 *ngFor="let item of search_his"><span class="badge badge-light large">
{ {item} }
<button type="button" class="close" (click)="del(item)">
<span>×</span>
</button>
</span></h3>
</div>
</div>
</div>
2.檢視中關鍵程式碼
search_his:any[]=[]
keywords:string=""
getkey(e:any){
//監聽使用者鍵盤事件,如果輸入回車即向搜尋歷史中新增文字框中的關鍵字
if(e.keyCode==13){
this.add_history()
}
}
add_history(){
//向搜尋歷史search_his中新增文字框中的關鍵字
if(this.search_his.indexOf(this.keywords)==-1){//如果search_his中沒有當前搜尋的資料,則進行新增
this.search_his.push(this.keywords)
}
}
del(item:any){
//從搜尋歷史search_his中刪除item關鍵字
this.search_his.splice(this.search_his.indexOf(item),1)
}
任務列表案例
1.模板
<div class="container">
<div class="card">
<div class="card-header"><h3 class="text-center">toDoList</h3></div>
<div class="card-body">
<form>
<div class="form-group ">
<label for="search" class="sr-only">search</label>
<input type="text" class="form-control col-sm-12" placeholder="輸入後點選回車新增新任務" name="keywords" (keydown)="getkey($event)" [(ngModel)]="keywords" id="search">
</div>
</form>
<hr>
<p>進行中任務</p>
<div class="custom-control custom-checkbox" *ngFor="let item of task_list;let key=index" [hidden]="item.status==true">
<input type="checkbox" class="custom-control-input" [(ngModel)]="item.status" [id]="'task'+key">
<label class="custom-control-label" [for]="'task'+key">{ {item.name} }</label>
<button type="button" class="close" (click)="del(index)">
<span>×</span>
</button>
</div>
<hr>
<p>已完成任務</p>
<div class="custom-control custom-checkbox" *ngFor="let item of task_list;let key=index" [hidden]="item.status==false">
<input type="checkbox" class="custom-control-input" [(ngModel)]="item.status" [id]="'task'+key">
<label class="custom-control-label" [for]="'task'+key">{ {item.name} }</label>
<button type="button" class="close" (click)="del(index)">
<span>×</span>
</button>
</div>
</div>
</div>
</div>
2.檢視中關鍵程式碼
task_list:any[]=[]
keywords:string=""
getkey(e:any){
//監聽使用者鍵盤事件,如果輸入回車即向搜尋歷史中新增文字框中的關鍵字
if(e.keyCode==13){
this.add_task()
e.target.value=""
}
}
add_task(){
//向任務列表中新增文字框中的關鍵字
if(this.judge_task_in_list(this.keywords)){//如果任務列表中不存在該關鍵詞,則進行新增
this.task_list.push({"name":this.keywords,"status":false})
}
}
judge_task_in_list(key:any){
//判斷任務列表中是否已存在傳入的關鍵詞,不存在返回true
for(var i=0;i<this.task_list.length;i++){
if(this.task_list[i].name==key){
return false
}
}
return true
}
del(index:any){
//從任務列表中刪除item關鍵字
this.task_list.splice(index,1)
}
服務
Angular中公共資源的一種存在形式
1
新建服務
ng g service services/storage //在app中建立storage服務到services資料夾
2
app中配置服務
修改app.modules.ts檔案
//匯入服務
import {StorageService} from './services/storage.service'
//新增服務的類名到providers屬性
providers: [
StorageService
],
3
檢視中使用服務
//匯入服務
import {StorageService} from '.././services/storage.service';
//元件類的構造方法傳入服務
constructor(public storage:StorageService){
//此時該類已自動新增屬性storage,用this.storage可呼叫服務
}
任務列表訊息持久化升級案例
1.模板
<div class="container">
<div class="card">
<div class="card-header"><h3 class="text-center">toDoList</h3></div>
<div class="card-body">
<form>
<div class="form-group ">
<label for="search" class="sr-only">search</label>
<input type="text" class="form-control col-sm-12" placeholder="輸入後點選回車新增新任務" name="keywords" (keydown)="getkey($event)" [(ngModel)]="keywords" id="search">
</div>
</form>
<hr>
<p>進行中任務</p>
<div class="custom-control custom-checkbox" *ngFor="let item of task_list;let key=index" [hidden]="item.status==true">
<input type="checkbox" class="custom-control-input" [(ngModel)]="item.status" (change)="update_to_local()" [id]="'task'+key"><!--較之前新增change事件-->
<label class="custom-control-label" [for]="'task'+key">{ {item.name} }</label>
<button type="button" class="close" (click)="del(index)">
<span>×</span>
</button>
</div>
<hr>
<p>已完成任務</p>
<div class="custom-control custom-checkbox" *ngFor="let item of task_list;let key=index" [hidden]="item.status==false">
<input type="checkbox" class="custom-control-input" [(ngModel)]="item.status" [id]="'task'+key">
<label class="custom-control-label" [for]="'task'+key">{ {item.name} }</label>
<button type="button" class="close" (click)="del(index)">
<span>×</span>
</button>
</div>
</div>
</div>
</div>
2.檢視中完整程式碼
import { Component, OnInit } from '@angular/core';
import {StorageService} from '.././services/storage.service';
@Component({
selector: 'app-nvbar',
templateUrl: './nvbar.component.html',
styleUrls: ['./nvbar.component.css']
})
export class NvbarComponent implements OnInit {
task_list:any[]=[]
keywords:string=""
constructor(public storage:StorageService){
//此時該類已自動新增屬性storage,用this.storage可呼叫服務
}
getkey(e:any){
//監聽使用者鍵盤事件,如果輸入回車即向搜尋歷史中新增文字框中的關鍵字
if(e.keyCode==13){
this.add_task()
e.target.value=""
}
}
add_task(){
//向任務列表中新增文字框中的關鍵字
if(this.judge_task_in_list(this.keywords)){//如果任務列表中不存在該關鍵詞,則進行新增
this.task_list.push({"name":this.keywords,"status":false})
this.update_to_local()
}
}
judge_task_in_list(key:any){
//判斷任務列表中是否已存在傳入的關鍵詞,不存在返回true
for(var i=0;i<this.task_list.length;i++){
if(this.task_list[i].name==key){
return false
}
}
return true
}
del(index:any){
//從任務列表中刪除item關鍵字
this.task_list.splice(index,1)
this.update_to_local()
}
update_to_local(){
//將任務列表更新到本地
this.storage.set("todolist",this.task_list)
}
ngOnInit() {
//當頁面重新整理時,會執行此方法
this.task_list=this.storage.get("todolist")
}
}
ViewChild獲取DOM節點
1
檢視裡引入ViewChild
import { ViewChild } from '@angular/core';
2
模板中的標籤繫結上id
<p #ibox>box</p><!--必須以此種方式寫id,否則無法識別-->
3
檢視中裝飾類裡的屬性
@ViewChild('ibox',{static: false}) mybox:any
4
在檢視的ngAfterViewInit函式中呼叫DOM節點
ngAfterViewInit():void{
//$("#box").css("color","red")
$(this.mybox.nativeElement).css("color","red")
}
5
側邊欄隱藏案例
//style.css檔案
body{
overflow: hidden;
}
//aside.component.css檔案
#right{
background: black;
width:200px;
height:100%;
right:0;
top:0;
position: absolute;
transform: translate(0,0);
transition: all 0.5s;
}
<!--aside.component.html檔案-->
<aside id="right" #right></aside>
<button class="btn btn-info" (click)="showaside()">彈出</button>
<button class="btn btn-info" (click)="hideaside()">隱藏</button>
//aside.component.ts檢視中關鍵程式碼
import { ViewChild } from '@angular/core';
@ViewChild('right',{static:false}) aside:any
ngOnInit() {
//當頁面重新整理時,會執行此方法
}
showaside(){
$(this.aside.nativeElement).css("transform","translate(0,0)")
}
hideaside(){
$(this.aside.nativeElement).css("transform","translate(100%,0)")
}
父元件與子元件間的通訊
1
父元件發訊息給子元件
子元件檢視
import { OnInit } from '@angular/core';
export class AsideComponent implements OnInit {
@Input() from_father:any//定義變數,從父元件接收資料
}
父元件模板
<app-aside [from_father]="the msg from father""></app-aside>
//父元件在模板透過定義動態屬性,向子元件傳送資料
2
子元件發訊息給父元件
子元件檢視
import { Output,EventEmitter } from '@angular/core';
export class AsideComponent implements OnInit {
@Output() private outer=new EventEmitter()//定義訊息傳送器,將透過outer物件向父元件傳送資料
ngOnInit() {
this.outer.emit("我是子元件")//元件初始化完成後傳送資料給父元件
}
}
父元件模板
<app-aside (outer)="run($event)"></app-aside>
<!--這裡必須用outer事件(和子元件變數outer名命保持一致)觸發檢視內的方法來接收子元件傳過來的資料-->
生命週期函式
元件建立、更新、銷燬時觸發的一些列方法
ngOnInit和ngAfterViewInit的區別
ngOnInit() {
//元件和指令初始化完成執行,並不是真正的dom載入完成,請求資料操作放在這裡
}
ngAfterViewInit():void{
//檢視載入完成後觸發的方法,dom操作放在這裡
}
非同步程式設計的幾種方法
1
回撥函式
2
事件監聽、釋出訂閱
3
Promise
4
Rxjs,本質上就是第2中方法
example:
透過一個服務,模擬向服務端請求資料的非同步過程
1)服務的核心ts程式碼
import {Observable} from 'rxjs'//僅用於rxjs
export class RequestService {
//服務端請求資料後,這裡透過定時器延長資料傳送時間,模擬資料請求延遲
data:any=""
constructor() { }
//定義回撥函式非同步
get_callback_data(cb){
var t=setInterval(()=>{
this.data='data from callback'
window.clearInterval(t)//此句註釋會持續執行回撥函式,即每隔3秒將會傳送一次資訊
cb(this.data)
},3000)
}
//定義promise非同步
get_promise_data(){
return new Promise((resolve)=>{
var t=setInterval(()=>{
this.data='data from promise'
window.clearInterval(t)//此句註釋後效果一樣,即僅傳送一次資訊
resolve(this.data)
},3000)
})
}
//定義rxjs非同步
get_rxjs_data(){
return new Observable((observe)=>{
var t=setInterval(()=>{
this.data='data from rxjs'
observe.next(this.data)//每隔3秒將會傳送一次資訊
//observe.error("失敗時返回資料")
},3000)
})
}
}
2)元件模擬客戶端核心ts程式碼
export class AsideComponent implements OnInit {
ngOnInit() {
//回撥函式方式
this.request.get_callback_data((data)=>{
console.log(data)//data from callback
})
//promise方式
this.request.get_promise_data().then((data)=>{
console.log(data)//data from promise
})
//rxjs方式
var d=this.request.get_rxjs_data().subscribe((data)=>{
console.log(data)
})
//取消訂閱,將中途撤回訊息獲取
//d.unsubscribe()
}
}
Rxjs非同步總結
功能較promise強大,獲取訊息可中途撤回,獲取的訊息可以進行過濾
//訊息過濾功能演示
//get_rxjs_data()將會持續傳送0,1,2,3,4……
//這是ts檢視模擬客戶端獲取資料
import { filter,map } from 'rxjs/operators'
export class AsideComponent implements OnInit {
this.request.get_rxjs_data().pipe(
filter((value:any)=>{if(value%2==0){return true;}})
).subscribe((data)=>{
console.log(data)//輸出0,2,4,6……
})
}
請求資料
1
配置app.modules.ts
//app.modules.ts檔案
//匯入
import { HttpClientModule } from '@angular/common/http'
@NgModule({
declarations: [
AppComponent,
HomeComponent
],
imports: [
BrowserModule,
AppRoutingModule,
HttpClientModule//新增模組
],
providers: [],
bootstrap: [AppComponent]
})
2
檢視函式中使用(無引數的get請求)
//匯入模組
import { HttpClient } from '@angular/common/http'
export class HomeComponent implements OnInit {
constructor(public http:HttpClient) { }//透過建構函式將新匯入模組傳入並賦值給http
ngOnInit() {
}
//呼叫該方法將會發出請求
getData(){
let api="http://a.itying.com/api/productlist"
this.http.get(api).subscribe((response)=>{
console.log(response)//輸出請求的資料
})
}
}
3
帶引數的post請求
import { HttpClient } from '@angular/common/http'
import { HttpHeaders } from '@angular/common/http'//請求頭模組
export class HomeComponent implements OnInit {
constructor(public http:HttpClient) { }
ngOnInit() {
}
dologin(){
const httpoptions={
headers:new HttpHeaders({'ContentType':"aplication/json"})//設定請求頭
}
let api="121.0.0.1:3000/login"
this.http.post(api,{"username":"zhanghuan","password":"123456"},httpoptions).subscribe((response)=>{
console.log(response)
})
}
}
4
使用jsonp跨域
1)在app.module.ts裡把jsonp模組匯入並配置
import { HttpClientModule } from '@angular/common/http'
import { HttpClientJsonpModule } from '@angular/common/http'
@NgModule({
declarations: [
AppComponent,
HomeComponent
],
imports: [
BrowserModule,
AppRoutingModule,
HttpClientModule,//新增模組
HttpClientJsonpModule//新增模組
],
providers: [],
bootstrap: [AppComponent]
})
2)在檢視檔案中使用
//關鍵程式碼
get_jsonp_data(){
let api="https://sug.so.360.cn/suggest?"
this.http.jsonp(api,"callback").subscribe((response)=>{
console.log(response)
})
}
5
axios獲取資料
angular預設安裝了此模組,如果未安裝執行npmn install axios --save
//關鍵程式碼
import axios from 'axios'
get_axiod_data(){
let api="http://a.itying.com/api/productlist"
axios.get(api).then((response)=>{
console.log(response)
})
}
路由
路由就是根據不同的url地址,動態讓根元件掛載其他元件來實現一個單頁面應用
1
配置路由
//app-routing.module.ts
//關鍵程式碼
const routes: Routes = [
{path:"home",component:HomeComponent},
{path:'content',component:ContentComponent},
{path:'**',component:HomeComponent},//這個必須放最下面,其下面的路由都匹配不到
];
2
模板
<a href="" [routerLink]="['/home']" routerLinkActive="text-info" >首頁</a>
<a href="" [routerLink]="['/content']" routerLinkActive="text-info" >詳情</a>
<a href="" [routerLink]="['/about']" routerLinkActive="text-info" >關於</a>
<!--以上a標籤點選後不會重新整理網頁,routerLinkActive屬性為點選後給該標籤加上對應的text-info類,移除其他標籤的text-info類-->
<a href="/about">關於</a><!--這是傳統a標籤會重新整理網頁-->
3
a標籤進行get方式傳值
<!--模板-->
<a href="" [routerLink]="['/about']" routerLinkActive="text-info" [queryParams]="{name:'zhanghuan'}">關於</a>
<!--queryParams動態屬性賦值引數物件-->
//about對應的檢視
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router'//匯入
@Component({
selector: 'app-about',
templateUrl: './about.component.html',
styleUrls: ['./about.component.scss']
})
export class AboutComponent implements OnInit {
constructor(public route:ActivatedRoute) { }
ngOnInit() {
this.route.queryParams.subscribe((data)=>{
console.log(data)//輸出 {name: "zhanghuan"}
})
}
}
4
動態路由
1)路由
//路由
const routes: Routes = [
{path:'content/:aid',component:ContentComponent},//aid接收引數
];
2)模板
<!--模板-->
<a href="" [routerLink]="['/content',1]" routerLinkActive="text-info" >詳情</a>
3)views檔案
//content的views檔案
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router'//匯入
@Component({
selector: 'app-content',
templateUrl: './content.component.html',
styleUrls: ['./content.component.scss']
})
export class ContentComponent implements OnInit {
constructor(public router:ActivatedRoute) { }
ngOnInit() {
this.router.params.subscribe((data)=>{
console.log(data)//輸出 {aid: "1"}
})
}
}
5
js跳轉
1)路由
const routes: Routes = [
{path:"home",component:HomeComponent},
{path:'content/:aid',component:ContentComponent},
{path:'about',component:AboutComponent},
{path:'**',redirectTo:"home"},//這個必須放最下面,其下面的路由都匹配不到
];
2)模板
<button class="btn btn-info" (click)="skip_home()">js方式跳轉home</button>
<button class="btn btn-info" (click)="skip_content()">js方式跳轉content</button>
<button class="btn btn-info" (click)="skip_about()">js方式跳轉about</button>
3)views檔案
import { Component } from '@angular/core';
import { Router } from '@angular/router'//匯入
import { NavigationExtras } from '@angular/router'//匯入
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss']
})
export class AppComponent {
title = 'angulardemo02';
constructor(public router:Router){}
skip_home(){//簡單跳轉
this.router.navigate(['home'])
}
skip_content(){//動態路由傳值跳轉
this.router.navigate(['content',1])
}
skip_about(){//get方式跳轉傳值
let queryParams:NavigationExtras={
queryParams:{"name":"zhanghuan"}
}
this.router.navigate(['about'],queryParams)
}
}
6
二級路由
1)路由檔案
const routes: Routes = [
{path:'home',component:HomeComponent},
{path:'product',component:ProductComponent,
children:[
{path:'class_manage',component:ClassifiedManagementComponent},
{path:'commodity',component:CommondityManagementComponent},
{path:'**',redirectTo:"class_manage"}
]
},
{path:'**',redirectTo:"home"}
];
2)product元件的檢視核心程式碼
export class ProductComponent implements OnInit {
mlist:any[]=[
{"title":"分類管理","url":"class_manage"},
{"title":"商品列表","url":"commodity"}
]
constructor() { }
ngOnInit() {
}
}
3)product元件的模板
<div class="container-fluid">
<div class="row">
<div class="col-md-3" style="height: 100%;">
<div class="card" >
<div class="card-body">
<div class="list-group" *ngFor="let item of mlist">
<a class="list-group-item list-group-item-action" [routerLink]="[item.url]" routerLinkActive="active" >{ {item.title} }</a>
</div>
<p></p>
</div>
</div>
</div>
<!-- 左側導航 -->
<div class="col-md-9">
<div class="card">
<div class="card-body">
<router-outlet></router-outlet>
<!-- 二級路由對應的元件將渲染在router-outlet裡 -->
</div>
</div>
</div>
<!-- 右側主體 -->
</div>
</div>
模組化實現懶載入
元件較多導致載入慢,將元件模組化使得初始化更快
1
建立模組
ng g module modules/user --routing
將會建立一個modules資料夾,裡面包含一個user資料夾,此資料夾內包含兩個檔案,分別為user-routing.module.ts,user.module.ts
2
建立根元件
ng g component modules/user
將會在modules/user裡建立四個檔案,分別是user.component.ts,user.component.spec.ts,user.component.html,user.component.css
3
透過路由跳轉到對應模組
1)一級路由設定
//app-routing.module.ts核心程式碼
const routes: Routes = [
{path:'user',loadChildren:'./modules/user/user.module#UserModule'},
{path:'product',loadChildren:'./modules/product/product.module#ProductModule'},
{path:'**',redirectTo:'user'},
];
2)二級路由設定
//product-routing.module.ts核心程式碼
const routes: Routes = [
{path:"",component:ProductComponent}
];
4
在模組外部訪問模組內的元件
1)配置模組的module.ts檔案
//模組的module.ts檔案,如user.module.ts,這裡僅僅是核心程式碼
@NgModule({
declarations: [UserComponent, ProfileComponent, AdressComponent, OrderComponent],
exports:[AdressComponent],//將想要外部訪問的元件進行暴露
imports: [
CommonModule,
UserRoutingModule
]
})
2)在app.module.ts檔案中進行配置
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppRoutingModule } from './app-routing.module';
import { UserModule } from './modules/user/user.module';//外部模組匯入
import { ProductModule } from './modules/product/product.module';//外部模組匯入
import { AppComponent } from './app.component';
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
AppRoutingModule,
ProductModule,//外部模組匯入
UserModule,//外部模組匯入
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }