摘要:前集回顧上一章里我們在里通過組合三個組件,并通過單向數(shù)據(jù)流的方式把她們驅(qū)動起來。設(shè)計每章都會提一下,先設(shè)計使用場景這種方式,我們稱之為,不了解的朋友參考以手寫依賴注入。
前集回顧
上一章里我們在AppComponent里通過組合InputItem、 CheckableItem、 Counter三個組件,并通過Unidirectional Data Flow(單向數(shù)據(jù)流)的方式把她們驅(qū)動起來。今天這章,我們講講angular2里的service。
本章源碼:service
本章使用angular2版本為:2.4.5,webpack版本為: 2.2.0
先來看看我們將要完成的效果圖:
需求分析(注意動畫部分),在上一章的基礎(chǔ)上我們加入了初始化數(shù)據(jù),在數(shù)據(jù)加載完成前會有一個loading,數(shù)據(jù)準備好之后loading消失,列表顯現(xiàn)。
設(shè)計use case每章都會提一下,先設(shè)計使用場景(這種方式,我們稱之為"BDD",不了解的朋友參考以BDD手寫依賴注入(dependency injection))。
重構(gòu)ts/app.tsimport {Component, OnInit} from "@angular/core"; import {Item} from "./CheckableItem"; //引入本章主題ItemService import {ItemService} from "./ItemService"; @Component({ selector: "my-app", template: `實現(xiàn)ItemServiceMy First Angular 2 App
Loading
`, directives: [InputItem, CheckableItem, Counter], //注入ItemService providers: [ItemService] }) export class AppComponent implements OnInit { items: Item[] = []; //聲明loading狀態(tài),初始值為true loading: boolean = true; //通過構(gòu)造器自動獲取ItemService實例 constructor(private _itemService: ItemService) { } //在組件初始化以后調(diào)用ItemService獲取初始化數(shù)據(jù) ngOnInit() { this._itemService .getItems() .then(data => { //重置loading狀態(tài)為false this.loading = false; //設(shè)置初始值 this.items = data; }); } addItem(item: Item) { this.items = [...this.items, item]; } toggle(item: Item, index: number) { this.items = [ ...this.items.slice(0, index), { isChecked: !item.isChecked, txt: item.txt }, ...this.items.slice(index + 1) ]; } }
touch ts/ItemService.ts
向剛創(chuàng)建的ts/ItemService.ts中,添加如下內(nèi)容:
import {Injectable} from "@angular/core"; import {Item} from "./CheckableItem"; //用Injectable裝飾器聲明該類可被依賴注入 @Injectable() export class ItemService { //設(shè)置一個初始值數(shù)組 private items: Item[] = [ { isChecked: true, txt: "Learn JavaScript" }, { isChecked: false, txt: "Learn TypeScript" }, { isChecked: false, txt: "Learn Angular2" } ]; //提供一個方法,返回初始數(shù)據(jù)的Promise getItems(): Promise查看效果> { return new Promise((resolve, reject) => { //這里手動做延遲是為了模擬網(wǎng)絡(luò)請求 setTimeout(() => { resolve(this.items); }, 1500); }); } }
本章內(nèi)容比較簡單,寫到這里差不多算結(jié)束了(其實還沒有哦!),先來跑跑看
npm start
OK,我確信這個代碼是可以運行的,那到底什么是service?我們現(xiàn)在來對著代碼講一講。
什么是serviceservice是可被替換的
service必須通過依賴注入使用
service通常用作數(shù)據(jù)存取等應(yīng)用中可公用邏輯部分
如何定義service必須通過@Injectable裝飾器聲明
import {Injectable} from "@angular/core"; @Injectable() export class ItemService { }使用service
引入service
import {ItemService} from "./ItemService";
切忌不要自作多情的new她哦?。。。?!
構(gòu)造器獲取實例
constructor(private _itemService: ItemService) { }
自動注入實例
就像directives那樣,添加到@Component的metadata中
providers: [ItemService]
就這么簡單,so easy 有木有?
重構(gòu)那么我們說,到這里就結(jié)束了嗎?請看下面,template里有這么一段:
用了*ngFor將items列表化
用了*ngIf控制loading的顯示狀態(tài)
是不是感覺有點兒矬了,如果能有個多帶帶的ItemList組件該多好?像這樣使用:
import {Component, OnInit} from "@angular/core"; import {Item} from "./CheckableItem"; import {ItemService} from "./ItemService"; @Component({ selector: "my-app", template: `實現(xiàn)ItemListMy First Angular 2 App
`, providers: [ItemService] }) export class AppComponent implements OnInit { items: Item[] = []; loading: boolean = true; constructor(private _itemService: ItemService) { } ngOnInit() { this._itemService .getItems() .then(data => { this.loading = false; this.items = data; }); } addItem(item: Item) { this.items = [...this.items, item]; } toggle(e: { item: Item, index: number }) { this.items = [ ...this.items.slice(0, e.index), { isChecked: !e.item.isChecked, txt: e.item.txt }, ...this.items.slice(e.index + 1) ]; } }
touch ts/ItemList.ts
向剛創(chuàng)建的ts/ItemList.ts中,添加如下內(nèi)容:
import {Component, Input, Output, EventEmitter, ChangeDetectionStrategy} from "@angular/core"; import { Item } from "./CheckableItem"; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, selector: "item-list", template: `Loading
` }) export class ItemList { @Input() data: Item[]; @Input() showLoading: boolean; @Output() onItemClicked = new EventEmitter(); clickItem(e: Item, i: number) { this.onItemClicked.emit({ item: e, index: i }); } }
一切都結(jié)束了,效果仍然沒有變,還是很屌的樣子!!!!
下回預(yù)告:使用Routing
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/79263.html
摘要:我們使用了模式書寫,并引入了思想,這些以前只在里見到的設(shè)計,現(xiàn)在里也有體現(xiàn),并且在本章中會著重講解多的協(xié)作。如果之前寫過,那對于這種書寫方式一定無比熟悉。每次數(shù)據(jù)的變更,無論是還是,都將變化冒泡到,然后由再向下逐級推送各組件是否重繪。 前集回顧 在上一章里我們講了如何在angular2下開發(fā)一個component(還沒做的趕緊去學吧)。我們使用了Unidirectional Data ...
angular2是什么?我猜不容我贅述,各位一定略有耳聞,無論是曾經(jīng)AngularJS的擁躉,亦或是React的粉絲,都或多或少的對她有過一點了解。未見其物、先聞其聲,angular2在問世之前已經(jīng)做足了宣傳,想必諸位也一定被下面各種詞匯所震懾,什么:TypeScript、 ES5、 ES6、 Dart、 Immutable、 Unidirectional Data Flow、 Reactive ...
摘要:通過增加刪除元素改變布局的。譬如和控制元素顯示隱藏,或者改變元素行為的。譬如設(shè)計看過我之前介紹以手寫依賴注入的朋友應(yīng)該已經(jīng)對行為驅(qū)動多少有些了解了。她有,并且包含了至少一個和一個標簽。,將左邊的事件傳遞給了右邊的表達式通常就是事件處理函數(shù)。 前集回顧 在上一章里我們講了如何為angular2搭建開發(fā)環(huán)境(還沒搭起來的趕緊去看哦),并使之跑起來我們的第一個My First Angular...
摘要:前言依賴注入是的核心概念之一。會幫我們管理并且維護這些依賴關(guān)系。在組件當中我們沒有看到任何操作符,但是程序啟動后我們可以看到控制臺打印了。 前言 依賴注入是Angular的核心概念之一。通過依賴注入,我們可以將復雜、繁瑣的對象管理工作交給Angular,將我們的工作重心更好的放在業(yè)務(wù)上。依賴注入本身是后端編碼的概念,熟悉Spring框架的對其應(yīng)該不陌生,Angular1首次將依賴注入引...
摘要:可以在不必打斷其它業(yè)務(wù)的前提下,升級應(yīng)用程序,因為這項工作可以多人協(xié)作完成,在一段時間內(nèi)逐漸鋪開,下面就方案展開說明主要依賴提供模塊。在混合式應(yīng)用中,我們同時運行了兩個版本的。這意味著我們至少需要和各提供一個模塊。 angular1.x 升級 angular2+ 方案 我給大家提供的是angular1.x和angular5并行,增量式升級方案,這樣大家可以循序漸進升級自己的應(yīng)用,不想看...
閱讀 2989·2023-04-25 17:22
閱讀 1554·2019-08-30 15:54
閱讀 1284·2019-08-30 15:53
閱讀 1803·2019-08-30 15:43
閱讀 3058·2019-08-29 12:29
閱讀 1244·2019-08-26 11:37
閱讀 3276·2019-08-23 18:02
閱讀 1618·2019-08-23 14:15