摘要:方式,定義了的鉤子也是可以引用的直接觀察某一個(gè)子組件調(diào)用的時(shí)候變身啦超級(jí)賽亞人變身啦超級(jí)賽亞人可以思考一下,是否任何形式的父組件流入子組件的方式,都可以觸發(fā)方法。其中,需要注意的是作用域的隔離,子組件可以很好的隔離作用域。
以下的測(cè)試?yán)佣伎梢栽?github 找到,但是最近好像不太穩(wěn)定。
其實(shí) ng2 在這方面做得挺好的,用起來(lái)也很簡(jiǎn)單,所以看完基本就可以動(dòng)手寫(xiě)一寫(xiě)。強(qiáng)大并不止是這一方面,在寫(xiě)這些的過(guò)程中,通過(guò)一些配置,讓開(kāi)發(fā)很純粹,有時(shí)間再錄一個(gè)新手入門(mén)的開(kāi)發(fā)教程。
(1) 父組件向子組件流入數(shù)據(jù)這種方式是最簡(jiǎn)單的,在 ng2 中處理得非常完美,通過(guò)在子組件中標(biāo)記 @Input() 輸入接口的方式進(jìn)行接收父組件的值,我下面的 demo 主要分了幾種場(chǎng)景,盡可能的多覆蓋不同情況吧。
基本上例子中覆蓋了常見(jiàn)的情況:
直接傳入一個(gè)字符串的情況,不需要綁定父組件的一個(gè)變量
綁定父組件變量的情況,然后可以在父組件中不斷修改
輸入別名的情況,可以在子組件中對(duì)輸入的變量名進(jìn)行重新設(shè)置
ngOnChanges() 在子組件中監(jiān)聽(tīng)屬性的修改
特殊情況下,我們需要對(duì)父組件傳入的數(shù)據(jù)進(jìn)行過(guò)濾
@ViewChild() 注解的跨多層子組件的觀察方式
說(shuō)了這么多,來(lái)看一下實(shí)際的代碼吧。
// Parent component import { Component, OnInit } from "@angular/core"; @Component({ selector: "app-parent", templateUrl: "./parent.component.html", styleUrls: ["./parent.component.css"] }) export class ParentComponent implements OnInit { baby: string = "你的名字"; constructor() { } ngOnInit() { } }
// Parent html請(qǐng)輸入 Baby 的名字:
// Child component import { Component, OnInit, Input, SimpleChange } from "@angular/core"; @Component({ selector: "app-child", templateUrl: "./child.component.html", styleUrls: ["./child.component.css"] }) export class ChildComponent implements OnInit { @Input() babyName: string; @Input() inputBabyName: string; @Input("aliasBabyName") aliasName: string; changes: string; constructor() { } ngOnInit() { } ngOnChanges(changes: SimpleChange) { this.changes = JSON.stringify(changes); } }
// Child html我是子組件的屬性(babyName) => {{babyName}}
我是跟父組件來(lái):{{inputBabyName}}
我是 aliasBabyName => aliasName:{{aliasName}}
那么我需要過(guò)濾一下值要怎么弄呢?
這樣我們就可以用到 setter 和 getter 的特性來(lái)做,具體如下:
// Child component _filterName: string = ""; @Input() set filterName(n: string) { this._filterName = n + "wowo~~~"; } get filterName() { return this._filterName; }
// Parent html
這個(gè)其實(shí)也是用 @Input() 這個(gè)注解來(lái)做的,有點(diǎn)類(lèi)似 computed 的概念吧,但是這樣做對(duì)于習(xí)慣 Java 的小伙伴是很友好的,其實(shí)通過(guò)一些權(quán)限的設(shè)置,還能夠更加的強(qiáng)大。
@ViewChild() 的方式
這種方式我覺(jué)得更多的是,我的溝通邏輯存在于 TS 中的時(shí)候就很實(shí)用。并且是描述性的定義方式,所以邏輯也是清晰的。
// Parent component // 方式1,定義了 `#` 的鉤子也是可以引用的 @ViewChild("child") cc: ChildComponent; // 直接觀察某一個(gè)子組件 @ViewChild(ChildComponent) cc_other: ChildComponent; // 調(diào)用的時(shí)候 this.cc.name = "變身啦!超級(jí)賽亞人"; this.cc_other.name = "變身啦!超級(jí)賽亞人 4";
(2) 子組件向父組件通信可以思考一下,是否任何形式的父組件流入子組件的方式,都可以觸發(fā) ngOnChanges() 方法。
從軟件的結(jié)構(gòu)上來(lái)講,是上層抽象對(duì)底層的具體實(shí)現(xiàn)是隱藏的,所以具體層的東西最好盡可能少的知道抽象層的事情,也許表達(dá)方式不一樣,但是這樣的話封閉性會(huì)好很多,更多的暴露是以某一個(gè)權(quán)限開(kāi)放的接口形式。但是通信是很復(fù)雜的東西,就好像人與人之間的聯(lián)系是一樣的。好吧,我們來(lái)具體說(shuō)一下子組件怎么訪問(wèn)父組件。主要通過(guò)的方式是:
在子組件定義一個(gè) @Output() 的 EventEmitter
父組件中定義一個(gè)自己的函數(shù)來(lái)修改自身的信息,或者再傳入其他子組件使用。
// Parent component import { Component, OnInit } from "@angular/core"; @Component({ selector: "app-parent", templateUrl: "./parent.component.html", styleUrls: ["./parent.component.css"] }) export class ParentComponent implements OnInit { babyName: string; constructor() { } ngOnInit() { this.babyName = "小擼一號(hào)"; } changeBabyName(newBabyName) { this.babyName = newBabyName; } }
// Parent htmlBabyName:{{babyName}}
import { Component, OnInit, Output, EventEmitter } from "@angular/core"; @Component({ selector: "app-child", templateUrl: "./child.component.html", styleUrls: ["./child.component.css"] }) export class ChildComponent implements OnInit { @Output() changeBabyName: EventEmitter= new EventEmitter (); rhashcode = /d.d{4}/; constructor() { } ngOnInit() { } getNewBabyName(e) { let newName = this.makeHashCode("小擼新號(hào)"); this.changeBabyName.next(newName); } /* UUID http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript */ makeHashCode(prefix) { prefix = prefix || "60sky"; return String(Math.random() + Math.random()).replace(this.rhashcode, prefix); } }
其中需要注意的是父組件中方法注入的 $event 對(duì)象,這個(gè)對(duì)象在這里注入的是子組件傳入的值,所以在父組件中就可以直接使用了,我這里定義了 string 類(lèi)型的數(shù)據(jù),所以傳入后定義接口的參數(shù)類(lèi)型也是相對(duì)應(yīng)的。
(3) 無(wú)關(guān)組件的通信ng2 在無(wú)關(guān)組件的處理上,真的處理得很干脆,給你一個(gè)鉤子,你用吧!就是這種簡(jiǎn)單的思路。這里我只介紹部分,因?yàn)楣俜轿臋n有更加詳細(xì)的介紹,不然我這篇文章就寫(xiě)得太長(zhǎng)了~因?yàn)榉绞接泻芏喾N,發(fā)揮小聰明就能發(fā)現(xiàn)很多。
事件回調(diào)傳來(lái)傳去的方式
Service 的注入
# 鉤子的方式
這里介紹的是一個(gè) # 鉤子的方式來(lái)做,直接來(lái)代碼吧,很方便的。
其中,需要注意的是作用域的隔離,子組件可以很好的隔離作用域。
// Parent component import { Component, OnInit } from "@angular/core"; @Component({ selector: "app-parent", templateUrl: "./parent.component.html", styleUrls: ["./parent.component.css"] }) export class ParentComponent implements OnInit { babyName: string = "小擼一號(hào)"; constructor() { } ngOnInit() { } }
// Parent html
// Child component import { Component, OnInit, Input } from "@angular/core"; @Component({ selector: "app-child", templateUrl: "./child.component.html", styleUrls: ["./child.component.css"] }) export class ChildComponent implements OnInit { @Input() childName: string; constructor() { } ngOnInit() { } }
Child:{{childName}}
// OtherChild component import { Component, OnInit, Input } from "@angular/core"; @Component({ selector: "app-otherChild", templateUrl: "./otherChild.component.html", styleUrls: ["./otherChild.component.css"] }) export class OtherChildComponent implements OnInit { @Input() helloBaby: string; constructor() { } ngOnInit() { } changeChildName(e) { this.helloBaby = "小擼新號(hào)"; } }
// OtherChild htmlotherChild:{{helloBaby}}
其實(shí)還有一些方式和特殊場(chǎng)景下的處理,所以總體來(lái)說(shuō),ng2 在這方面是不錯(cuò)的~
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/91341.html
摘要:下一篇譯精通使用開(kāi)發(fā)二原版書(shū)名第一章之道這一章主要是介紹,包括這個(gè)框架以及它背后的項(xiàng)目。幸運(yùn)的是,擁有一個(gè)活躍的,支持度高的社區(qū)。另外,社區(qū)還為已經(jīng)存在的工具箱里貢獻(xiàn)了許多有意思的工具。 下一篇:【譯】《精通使用AngularJS開(kāi)發(fā)Web App》(二) 原版書(shū)名:Mastering Web Application Development with AngularJS Ch...
摘要:首先,我們需要在入口頁(yè)面的中配置根路徑然后創(chuàng)建一個(gè)路由模塊路由配置在主模塊中導(dǎo)入配置好的路由模塊而在頁(yè)面中需要一個(gè)容器去承載上面代碼中的定義了用戶點(diǎn)擊后的路由跳轉(zhuǎn),定義該路由激活時(shí)的樣式類(lèi)。 剛實(shí)習(xí)的時(shí)候用過(guò)AngularJS,那時(shí)候真的是連原生JavaScript都不會(huì)寫(xiě),依樣畫(huà)葫蘆做了幾個(gè)管理后臺(tái)。然后突然換項(xiàng)目了,AngularJS就不寫(xiě)了,感覺(jué)前前后后接觸了一年多的Angula...
摘要:有二維碼掃描功能,還做了類(lèi)似消息可拖拽效果,上拉下拉刷新,輪播圖組件。特別適合用于基于模式的移動(dòng)應(yīng)用程序開(kāi)發(fā)。簡(jiǎn)介是一個(gè)用基于,和的,創(chuàng)建移動(dòng)跨平臺(tái)移動(dòng)應(yīng)用程序的快速開(kāi)發(fā)平臺(tái)。 這個(gè)項(xiàng)目做得比較早,當(dāng)時(shí)是基于ionic1和angular1做的。做了四個(gè)tabs的app,首頁(yè)模仿攜程首頁(yè),第二頁(yè)主要是phonegap調(diào)用手機(jī)核心功能,第三頁(yè)模仿微信和qq聊天頁(yè),第四頁(yè)模仿一般手機(jī)的表單設(shè)...
摘要:主要兼容的微信的瀏覽器,因?yàn)橐谂笥讶?lái)營(yíng)銷(xiāo),總體來(lái)說(shuō),會(huì)偏設(shè)計(jì)以及動(dòng)畫(huà)些。 有一天,我們組內(nèi)的一個(gè)小伙伴突然問(wèn)我,你知道有一個(gè)叫重構(gòu)工程師的崗位?這是干什么的?重構(gòu)工程師 這個(gè)問(wèn)題引發(fā)了我對(duì)前端領(lǐng)域發(fā)展的思考,所以我來(lái)梳理下前端領(lǐng)域的發(fā)展過(guò)程,順便小小的預(yù)測(cè)下2017年的趨勢(shì)。不想看回憶的,可以直接跳到后面看展望。 神說(shuō),要有光,就有了光 自1991年蒂姆·伯納斯-李公開(kāi)提及HTML...
摘要:主要兼容的微信的瀏覽器,因?yàn)橐谂笥讶?lái)營(yíng)銷(xiāo),總體來(lái)說(shuō),會(huì)偏設(shè)計(jì)以及動(dòng)畫(huà)些。 有一天,我們組內(nèi)的一個(gè)小伙伴突然問(wèn)我,你知道有一個(gè)叫重構(gòu)工程師的崗位?這是干什么的?重構(gòu)工程師 這個(gè)問(wèn)題引發(fā)了我對(duì)前端領(lǐng)域發(fā)展的思考,所以我來(lái)梳理下前端領(lǐng)域的發(fā)展過(guò)程,順便小小的預(yù)測(cè)下2017年的趨勢(shì)。不想看回憶的,可以直接跳到后面看展望。 神說(shuō),要有光,就有了光 自1991年蒂姆·伯納斯-李公開(kāi)提及HTML...
閱讀 1650·2019-08-30 15:44
閱讀 2573·2019-08-30 11:19
閱讀 406·2019-08-30 11:06
閱讀 1567·2019-08-29 15:27
閱讀 3085·2019-08-29 13:44
閱讀 1629·2019-08-28 18:28
閱讀 2358·2019-08-28 18:17
閱讀 1987·2019-08-26 10:41