最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Angular2 父子組件通信方式的示例

 更新時(shí)間:2018年01月29日 10:07:30   作者:Husbin  
本篇文章主要介紹了Angular2 父子組件通信方式的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

Angular2官方文檔對(duì)組件交互這塊有詳細(xì)的介紹-->文檔--組件之間的交互。按文檔介紹,組件間交互的方式一共有4種,包括:

  1. 通過輸入型綁定把數(shù)據(jù)從父組件傳到子組件(@Input decoration);子組件暴露一個(gè)EventEmitter屬性(@Output decoration),當(dāng)事件發(fā)生時(shí),利用該屬性emits向父組件發(fā)射事件。
  2. 父組件與子組件通過本地變量互動(dòng)。(# var)
  3. 父組件調(diào)用@ViewChild。
  4. 父組件和子組件通過服務(wù)來通訊。

我在這里只總結(jié)、詳細(xì)介紹3種我在項(xiàng)目中使用過的方法,看完本文大概能做到如下的效果:


創(chuàng)建項(xiàng)目,項(xiàng)目結(jié)構(gòu)如下:


通過@Input、@Output裝飾器進(jìn)行父、子組件間的通信

@Input:該屬性綁定用于父組件向子組件傳遞數(shù)據(jù)。子組件可以通過以下兩種方法截取屬性的變更:

  1. 使用一個(gè)輸入屬性的setter,以攔截父組件中值得變化。
  2. 通過ngOnchanges()來截聽輸入屬性值的變化。

@Output:該數(shù)據(jù)綁定用于子組件向父組件傳遞數(shù)據(jù)和事件。

<!--parent.component.html-->
<div style="width: 1000px;margin: auto">
<div class="card" style="width: 500px;float: left">
 <div class="card-header">
  父組件
 </div>
 <div class="card-body">
  <h5 class="card-title">父組件</h5>
  <div class="form-group">
   <label for="input">父組件輸入:</label>
   <input type="text"
       class="form-control"
       id="input"
       placeholder="Input something"
       [(ngModel)]="parentPrint" 
   >
   <label for="output">父組件輸出:</label>
   <input type="text"
       class="form-control"
       id="output"
       placeholder="Output something"
       [(ngModel)]="contentFromChild"
   >
  </div>
 </div>
</div>
<app-child
 [fromParent]="parentPrint"
 (fromChild)="fromChild($event)"
></app-child>
</div>
<!--child.component.html-->
<div class="card" style="width: 500px;">
 <div class="card-header">
  子組件
 </div>
 <div class="card-body">
  <h5 class="card-title">子組件</h5>
  <div class="form-group">
   <label for="input">子組件輸入:</label>
   <input type="text"
       class="form-control"
       id="input"
       placeholder="Input something"
       [(ngModel)]="contentFromChild"
   >
   <label for="output">子組件輸出:</label>
   <input type="text"
       class="form-control"
       id="output"
       placeholder="Output something"
       [(ngModel)]="fromParent"
   >
  </div>
  <button class="btn btn-primary" (click)="clickChild()">Output方式</button>
 </div>
</div>

效果如下:(1、父組件輸入,子組件可同步輸出;2、子組件輸入需要(3、)點(diǎn)擊按鈕觸發(fā)發(fā)射事件,將數(shù)據(jù)傳送給父組件。)


@Input:父組件輸入的同時(shí),子組件能同步獲取數(shù)據(jù)進(jìn)行顯示。核心代碼如下:

//父組件
parentPrint: any;      //ts中,聲明一個(gè)變量
[(ngModel)]="parentPrint"  //html中,綁定變量,獲取用戶輸入
//html中,將數(shù)據(jù)傳給子組件
<app-child [fromParent]="parentPrint"></app-child> 
//子組件
@Input() fromParent;    //ts中,用于直接接收從父組件獲取的數(shù)據(jù)
[(ngModel)]="fromParent"  //html中,用于顯示數(shù)據(jù)

通過setter截聽輸入屬性值的變化,在子組件中聲明一個(gè)私有變量來獲取父組件傳遞過來的數(shù)據(jù),從而屏蔽上層獲取下層信息。(簡(jiǎn)單一點(diǎn)就是不讓父組件知道子組件用什么東西去接收傳過來的數(shù)據(jù))通過這種方法也可以獲得同樣的效果。

//子組件
 private _fromParent: any;   //私有變量,通過setter獲取父組件的數(shù)據(jù)
@Input()            //通過setter獲取父組件的數(shù)據(jù)
 set fromParent(fromParent: any) {
  this._fromParent = fromParent;
 }
 get fromParent(): any {
  return this._fromParent;
 }

@Output:父組件接收子組件的數(shù)據(jù)時(shí),子組件暴露一個(gè)EventEmitter屬性,當(dāng)事件發(fā)生時(shí),子組件利用該屬性emits(向上彈射)事件。父組件綁定到這個(gè)事件屬性,并在事件發(fā)生時(shí)作出回應(yīng)。核心代碼如下:

//子組件
@Output() fromChild = new EventEmitter<any>(); //暴露一個(gè)輸出屬性

<button class="btn btn-primary" (click)="clickChild()">Output方式</button> 
 //觸發(fā)發(fā)射函數(shù),將數(shù)據(jù)發(fā)送給父組件
 clickChild() {
  console.log('click child' , this.contentFromChild);
  this.fromChild.emit(this.contentFromChild);
 }
//父組件
[(ngModel)]="contentFromChild" //綁定輸出子組件的數(shù)據(jù)
//使用子組件,綁定事件屬性
<app-child
 [fromParent]="parentPrint"
 (fromChild)="fromChild($event)"
></app-child>
//事件處理函數(shù)
 fromChild(event) {
  console.log(event);
  this.contentFromChild = event;
 }

父組件通過調(diào)用@ViewChild()來獲取子組件的數(shù)據(jù)

如果父組件的類需要讀取子組件的屬性和值或調(diào)用子組件的方法時(shí),就可以把子組件作為ViewChild,注入到父組件里面。ViewChild顧名思義就是可以看見子組件里面的屬性和方法。

<!--parent.component.html-->
<div style="width: 1000px;margin: auto">
<div class="card" style="width: 500px;float: left">
 <div class="card-header">
  父組件
 </div>
 <div class="card-body">
  <h5 class="card-title">父組件</h5>
  <div class="form-group">
   <label for="viewoutput">ViewChild父組件輸出:</label>
   <input type="text"
       class="form-control"
       id="viewoutput"
       placeholder="ViewChild父組件輸出"
       [(ngModel)]="viewOutput"
   >
  </div>
  <button class="btn btn-primary" (click)="clickView()">ViewChild方式</button>
 </div>
</div>
<app-child></app-child>
</div>
<!--child.component.html-->
<div class="card" style="width: 500px;">
 <div class="card-header">
  子組件
 </div>
 <div class="card-body">
  <h5 class="card-title">子組件</h5>
  <div class="form-group">
   <label for="input">子組件輸入:</label>
   <input type="text"
       class="form-control"
       id="input"
       placeholder="Input something"
       [(ngModel)]="contentFromChild"
   >
  </div>
 </div>
</div>

效果如下:

父組件核心代碼:

//ts
@ViewChild(ChildComponent)         // 使用viewChild導(dǎo)入引用
private childComponent: ChildComponent;   // 將子組件注入到私有屬性
//獲取子組件數(shù)據(jù)并顯示
clickView() {
  //直接獲取子組件的屬性
  this.viewOutput = this.childComponent.contentFromChild;
 }
//html
[(ngModel)]="viewOutput"
 <button class="btn btn-primary" (click)="clickView()">ViewChild方式</button>

父組件和子組件通過服務(wù)來通訊

父組件和它的子組件共享同一個(gè)服務(wù),利用該服務(wù)在家庭內(nèi)部實(shí)現(xiàn)雙向通訊。

<!--parent.component.html-->
<div style="width: 1000px;margin: auto">
<div class="card" style="width: 500px;float: left">
 <div class="card-header">
  父組件
 </div>
 <div class="card-body">
  <h5 class="card-title">父組件</h5>
  <div class="form-group">
   <label for="serviceoutput">父組件服務(wù)輸入:</label>
   <input type="text"
       class="form-control"
       id="serviceoutput"
       placeholder="服務(wù)輸入"
       [(ngModel)]="serviceInput"
   >
  </div>
  <button class="btn btn-primary" (click)="clickService()">Service方式</button>
 </div>
</div>
<app-child></app-child>
</div>
<!--child.component.html-->
<div class="card" style="width: 500px;">
 <div class="card-header">
  子組件
 </div>
 <div class="card-body">
  <h5 class="card-title">子組件</h5>
  <div class="form-group">
   <label for="serviceoutput">子組件服務(wù)輸入:</label>
   <input type="text"
       class="form-control"
       id="serviceoutput"
       placeholder="服務(wù)輸入"
       [(ngModel)]="serviceInput"
   >
  </div>
  <button class="btn btn-primary" (click)="clickService()">Service方式</button>
 </div>
</div>

//服務(wù)
//meditor.service.ts
import {Injectable} from '@angular/core';
import {Subject} from 'rxjs/Subject';
import {Observable} from 'rxjs/Observable';

@Injectable()
export class MeditorService {
 private subject = new Subject<MeditorMsg>();
 constructor() {}
 // 獲取訂閱者
 public getObservable(): Observable<MeditorMsg> {
  return this.subject.asObservable();
 }
 // 推送信息
 public push(msg: MeditorMsg) {
  this.subject.next(msg);
 }
}
// 中間者信息
export interface MeditorMsg {
 id: string;
 body: any;
}

效果如下:


父子組件的核心代碼類似,在構(gòu)造函數(shù)中將該服務(wù)實(shí)例注入到自身,父子組件都有一個(gè)唯一的id。無論是父組件還是子組件調(diào)用push()方法推送數(shù)據(jù),雙方都能接收到數(shù)據(jù),這時(shí)候就要根據(jù)id來判斷是要父組件使用數(shù)據(jù)還是子組件使用數(shù)據(jù)。核心代碼如下:

subscription: Subscription = null; //初始化一個(gè)訂閱對(duì)象
//子組件構(gòu)造函數(shù),用于監(jiān)聽數(shù)據(jù)推送
constructor(
  private meditor: MeditorService
 ) {
  this.subscription = meditor.getObservable().subscribe(
   msg => {
    console.log(msg);
    if (msg.id === 'parent') {   //id為parent,獲取父組件數(shù)據(jù)
     this.serviceInput = msg.body;
    }
   }
  );
 }
// 子組件將數(shù)據(jù)推送到中間著,給訂閱者
clickService() {
  this.meditor.push({id: 'parent', body: this.serviceInput});
 }
//父組件構(gòu)造函數(shù),用于監(jiān)聽數(shù)據(jù)推送
constructor(
  private meditor: MeditorService
 ) {
  this.subscription = meditor.getObservable().subscribe(
   msg => {
    console.log(msg);
    if (msg.id === 'child') {    //id為child,獲取子組件數(shù)據(jù)
     this.serviceInput = msg.body;
    }
   }
  );
 }
// 父組件將數(shù)據(jù)推送到中間著,給訂閱者
clickService() {
  this.meditor.push({id: 'parent', body: this.serviceInput});
 }

我上面寫的還不是很完善,就是在生命周期結(jié)束前,也就是在onDestroy周期中,要取消訂閱。

以上,就是最近在使用的組件交互的總結(jié)。個(gè)人覺得通過服務(wù)來交互的可擴(kuò)展性更強(qiáng)。例如,我們項(xiàng)目中用到了一個(gè)動(dòng)態(tài)顯示的側(cè)欄,不同時(shí)期點(diǎn)擊顯示側(cè)欄要顯示不同的東西。這個(gè)時(shí)候把側(cè)欄作為父組件,子組件作為消息的一部分傳遞給父組件,父組件根據(jù)子組件名動(dòng)態(tài)生成模板,顯示在側(cè)欄上面。說了這么多廢話大概就是下圖的意思:


最后附上demo源碼:父子組件交互demo

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • angularjs 源碼解析之scope

    angularjs 源碼解析之scope

    $scope 的使用貫穿整個(gè) Angular App 應(yīng)用,它與數(shù)據(jù)模型相關(guān)聯(lián),同時(shí)也是表達(dá)式執(zhí)行的上下文.有了 $scope 就在視圖和控制器之間建立了一個(gè)通道,基于作用域視圖在修改數(shù)據(jù)時(shí)會(huì)立刻更新 $scope,同樣的 $scope 發(fā)生改變時(shí)也會(huì)立刻重新渲染視圖.
    2016-08-08
  • Angular1.x自定義指令實(shí)例詳解

    Angular1.x自定義指令實(shí)例詳解

    這篇文章主要介紹了Angular1.x自定義指令,結(jié)合實(shí)例形式分析了Angular1.x自定義指令的實(shí)現(xiàn)與使用方法,以及相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2017-03-03
  • 詳解AngularJS中的作用域

    詳解AngularJS中的作用域

    這篇文章主要介紹了詳解AngularJS中的作用域,是AngularJS學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-06-06
  • angular.js和vue.js中實(shí)現(xiàn)函數(shù)去抖示例(debounce)

    angular.js和vue.js中實(shí)現(xiàn)函數(shù)去抖示例(debounce)

    這篇文章主要介紹了angular.js和vue.js中實(shí)現(xiàn)函數(shù)去抖示例(debounce),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-01-01
  • 關(guān)于Angularjs中自定義指令一些有價(jià)值的細(xì)節(jié)和技巧小結(jié)

    關(guān)于Angularjs中自定義指令一些有價(jià)值的細(xì)節(jié)和技巧小結(jié)

    這篇文章主要介紹了關(guān)于Angularjs中自定義指令一些有價(jià)值的細(xì)節(jié)和技巧小結(jié),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-04-04
  • 基于Angularjs實(shí)現(xiàn)分頁功能

    基于Angularjs實(shí)現(xiàn)分頁功能

    這篇文章主要介紹了基于Angularjs實(shí)現(xiàn)分頁功能的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-05-05
  • AngularJS 獲取ng-repeat動(dòng)態(tài)生成的ng-model值實(shí)例詳解

    AngularJS 獲取ng-repeat動(dòng)態(tài)生成的ng-model值實(shí)例詳解

    這篇文章主要介紹了AngularJS 獲取ng-repeat動(dòng)態(tài)生成的ng-model值實(shí)例詳解的相關(guān)資料,這里提供實(shí)例代碼及實(shí)現(xiàn)效果圖,需要的朋友可以參考下
    2016-11-11
  • 最新評(píng)論

    仁寿县| 长宁区| 永顺县| 丽水市| 诸暨市| 石家庄市| 鹤庆县| 大丰市| 北安市| 会宁县| 娄烦县| 马关县| 尼玛县| 繁峙县| 阳朔县| 莎车县| 平乐县| 鲁山县| 谷城县| 静安区| 扬州市| 张家港市| 九龙坡区| 天峻县| 富源县| 景宁| 平湖市| 花莲县| 微山县| 钟山县| 安陆市| 花莲县| 江口县| 虎林市| 手游| 景洪市| 辽阳市| 封丘县| 康马县| 黑龙江省| 汾阳市|