angular2 組件通訊

五種方式

1. @input

把父組件中的值傳遞到子組件中祸挪,子組件聲明變量時(shí)畴椰,前面用@input裝飾器。
例子1:
子組件中

import { Component, Input } from '@angular/core';
import { Hero } from './hero';
@Component({
    selector: 'hero-child',
    template: `
      <h3>{{hero.name}} says:</h3>
      <p>I, {{hero.name}}, am at your service, {{masterName}}.</p>
  `
})
export class HeroChildComponent {
  @Input() hero: Hero;
  @Input('master') masterName: string;
}

父組件中

import { Component } from '@angular/core';
import { HEROES } from './hero';
@Component({
  selector: 'hero-parent',
  template: `
    <h2>{{master}} controls {{heroes.length}} heroes</h2>
    <hero-child *ngFor="let hero of heroes"
      [hero]="hero"
      [master]="master">
    </hero-child>  `
})
export class HeroParentComponent {
  heroes = HEROES;
  master: string = 'Master';
}

2. setter

結(jié)合@input可以實(shí)現(xiàn)對數(shù)據(jù)的get弃榨,set
例子2:
子組件中

  import { Component, Input } from '@angular/core';
@Component({
  selector: 'name-child',
  template: '{{name}}' 
})
export class NameChildComponent {
  private _name = '';
  @Input()
  set name(name: string) {
    this._name = (name && name.trim()) || '<no name set>';
  }
  get name(): string { return this._name; }
}

父組件中

import { Component } from '@angular/core';
@Component({
  selector: 'name-parent',
  template: `
  <h2>Master controls {{names.length}} names</h2>
  <name-child *ngFor="let name of names" [name]="name"></name-child>
  `
})
export class NameParentComponent {
  // Displays 'Mr. IQ', '<no name set>', 'Bombasto'
  names = ['Mr. IQ', '   ', '  Bombasto  '];
}

這個(gè)例子中箍铲,子組件中定義了一個(gè)私有變量_name雇卷,接受父組件的name,且定義了name的get和set方法颠猴。通過set設(shè)置默認(rèn)值关划,通過get返回定義的_name

3.聲明周期鉤子 ngOnChanges

監(jiān)聽屬性的變化
例子3:

import { Component, Input, OnChanges, SimpleChange } from '@angular/core';
@Component({
  selector: 'version-child',
  template: `
    <h3>Version {{major}}.{{minor}}</h3>
    <h4>Change log:</h4>
    <ul>
      <li *ngFor="let change of changeLog">{{change}}</li>
    </ul>
  `
})
export class VersionChildComponent implements OnChanges {
  @Input() major: number;
  @Input() minor: number;
  changeLog: string[] = [];
  ngOnChanges(changes: {[propKey: string]: SimpleChange}) {
    let log: string[] = [];
    for (let propName in changes) {
      let changedProp = changes[propName];
      let to = JSON.stringify(changedProp.currentValue);
      if (changedProp.isFirstChange()) {
        log.push(`Initial value of ${propName} set to ${to}`);
      } else {
        let from = JSON.stringify(changedProp.previousValue);
        log.push(`${propName} changed from ${from} to ${to}`);
      }
    }
    this.changeLog.push(log.join(', '));
  }
}
import { Component } from '@angular/core';
@Component({
  selector: 'version-parent',
  template: `
    <h2>Source code version</h2>
    <button (click)="newMinor()">New minor version</button>
    <button (click)="newMajor()">New major version</button>
    <version-child [major]="major" [minor]="minor"></version-child>
  `
})
export class VersionParentComponent {
  major: number = 1;
  minor: number = 23;
  newMinor() {
    this.minor++;
  }
  newMajor() {
    this.major++;
    this.minor = 0;
  }
}

在這個(gè)例子中,通過ngOnChanges監(jiān)測了兩個(gè)數(shù)據(jù)的變化,并在數(shù)據(jù)變化時(shí),將數(shù)據(jù)打印到日志上.
一旦數(shù)據(jù)有變化,那么ngOnChanges就會(huì)執(zhí)行,且變化的數(shù)據(jù)會(huì)進(jìn)入到changes對象中.

4.EventEmitter

它是一個(gè)輸出屬性,所以通常帶@Output裝飾器
例子4
子組件

import { Component, EventEmitter, Input, Output } from '@angular/core';
@Component({
  selector: 'my-voter',
  template: `
    <h4>{{name}}</h4>
    <button (click)="vote(true)"  [disabled]="voted">Agree</button>
    <button (click)="vote(false)" [disabled]="voted">Disagree</button>
  `
})
export class VoterComponent {
  @Input()  name: string;
  @Output() onVoted = new EventEmitter<boolean>();
  voted = false;
  vote(agreed: boolean) {
    this.onVoted.emit(agreed);
    this.voted = true;
  }
}

父組件

import { Component }      from '@angular/core';
@Component({
  selector: 'vote-taker',
  template: `
    <h2>Should mankind colonize the Universe?</h2>
    <h3>Agree: {{agreed}}, Disagree: {{disagreed}}</h3>
    <my-voter *ngFor="let voter of voters"
      [name]="voter"
      (onVoted)="onVoted($event)">
    </my-voter>
  `
})
export class VoteTakerComponent {
  agreed = 0;
  disagreed = 0;
  voters = ['Mr. IQ', 'Ms. Universe', 'Bombasto'];
  onVoted(agreed: boolean) {
    agreed ? this.agreed++ : this.disagreed++;
  }
}

(onvoted)='onvoted($event)'中的(onvoted)對應(yīng)子組件中的@Output() onVoted = new EventEmitter<boolean>();通過this.onVoted.emit(agreed);觸發(fā), onvoted($event)對應(yīng)父組件的onvoted方法.$event為傳遞參數(shù)的一個(gè)媒介

5.本地變量

用該方法可以在父組件中讀取子組件中的屬性以及方法
例子:5
父組件中

...
template:`
<child #ch></child> 
<button (click)='ch.test'>test<button>
 `
...

子組件中

import { Component }    from '@angular/core';
@Component({
selector:'child'
...
})
export class  childComponent{
test(){
  console.log(' this is a test')
}
}

通過這個(gè)方法,可以在父組件中,讀取子組件內(nèi)的方法

6.@viewchild()

例子6

import { AfterViewInit, ViewChild } from '@angular/core';
import { Component }                from '@angular/core';
import { A }  from './A';

@Component({
...
})
export class B implements AfterViewInit{
 @ViewChild(A)
  private aa: A;

start(){
  this.aa.start()
 }
}

將子組件作為viewchild 注入到父組件中,就可以通過該對象讀取A組件里的方法以及屬性

7.通過服務(wù)

import { Injectable } from '@angular/core';

通過此編寫服務(wù),在兩個(gè)組件內(nèi)都引入,那么就可以同時(shí)使用這個(gè)實(shí)例,個(gè)人理解為一個(gè)倉庫,組件類似使用者,通過構(gòu)造方法注入后,那么就可以使用它

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市翘瓮,隨后出現(xiàn)的幾起案子贮折,更是在濱河造成了極大的恐慌,老刑警劉巖资盅,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件调榄,死亡現(xiàn)場離奇詭異,居然都是意外死亡律姨,警方通過查閱死者的電腦和手機(jī)振峻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來择份,“玉大人扣孟,你說我怎么就攤上這事∪俑希” “怎么了凤价?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長拔创。 經(jīng)常有香客問我利诺,道長,這世上最難降的妖魔是什么剩燥? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任慢逾,我火速辦了婚禮立倍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘侣滩。我一直安慰自己口注,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布君珠。 她就那樣靜靜地躺著寝志,像睡著了一般。 火紅的嫁衣襯著肌膚如雪策添。 梳的紋絲不亂的頭發(fā)上材部,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機(jī)與錄音唯竹,去河邊找鬼乐导。 笑死,一個(gè)胖子當(dāng)著我的面吹牛摩窃,可吹牛的內(nèi)容都是我干的兽叮。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼猾愿,長吁一口氣:“原來是場噩夢啊……” “哼鹦聪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蒂秘,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤泽本,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后姻僧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體规丽,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年撇贺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了赌莺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡松嘶,死狀恐怖艘狭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情翠订,我是刑警寧澤巢音,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站尽超,受9級特大地震影響官撼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜似谁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一傲绣、第九天 我趴在偏房一處隱蔽的房頂上張望掠哥。 院中可真熱鬧,春花似錦秃诵、人聲如沸龙致。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至屈梁,卻和暖如春嗤练,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背在讶。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工煞抬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人构哺。 一個(gè)月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓革答,卻偏偏與公主長得像,于是被迫代替她去往敵國和親曙强。 傳聞我的和親對象是個(gè)殘疾皇子残拐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)碟嘴,斷路器溪食,智...
    卡卡羅2017閱讀 134,629評論 18 139
  • 1.import static是Java 5增加的功能,就是將Import類中的靜態(tài)方法,可以作為本類的靜態(tài)方法來...
    XLsn0w閱讀 1,216評論 0 2
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法娜扇,類相關(guān)的語法错沃,內(nèi)部類的語法,繼承相關(guān)的語法雀瓢,異常的語法枢析,線程的語...
    子非魚_t_閱讀 31,598評論 18 399
  • 學(xué)習(xí)資料來自 Angular.cn 與 Angular.io。 模板語法 在線例子 在 Angular 中刃麸,組件扮...
    小鐳Ra閱讀 3,721評論 0 3
  • 思路: 1醒叁、通過runtime添加兩個(gè)字符串屬性,供外接訪問嫌蚤。一個(gè)為設(shè)置占位字符串(placeholder)使用辐益,...
    逍遙晨旭閱讀 1,468評論 6 13