<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        Angular中Input和Output的介紹(附代碼)

        來源:懂視網 責編:小采 時間:2020-11-27 19:27:11
        文檔

        Angular中Input和Output的介紹(附代碼)

        Angular中Input和Output的介紹(附代碼):本篇文章給大家帶來的內容是關于Angular中Input和Output的介紹(附代碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。Input 是屬性裝飾器,用來定義組件內的輸入屬性。在實際應用場合,我們主要用來實現父組件向子組件傳遞數據。Ang
        推薦度:
        導讀Angular中Input和Output的介紹(附代碼):本篇文章給大家帶來的內容是關于Angular中Input和Output的介紹(附代碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。Input 是屬性裝飾器,用來定義組件內的輸入屬性。在實際應用場合,我們主要用來實現父組件向子組件傳遞數據。Ang

        本篇文章給大家帶來的內容是關于Angular中Input和Output的介紹(附代碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

        Input 是屬性裝飾器,用來定義組件內的輸入屬性。在實際應用場合,我們主要用來實現父組件向子組件傳遞數據。Angular 應用是由各式各樣的組件組成,當應用啟動時,Angular 會從根組件開始啟動,并解析整棵組件樹,數據由上而下流下下一級子組件。

        @Input()

        counter.component.ts
        import { Component, Input } from '@angular/core';
        @Component({
         selector: 'exe-counter',
         template: `
         <p>當前值: {{ count }}</p>
         <button (click)="increment()"> + </button>
         <button (click)="decrement()"> - </button>
         `
        })
        export class CounterComponent {
         @Input() count: number = 0;
         increment() {
         this.count++;
         }
         decrement() {
         this.count--;
         }
        }

        app.component.ts

        import { Component } from '@angular/core';
        @Component({
         selector: 'exe-app',
         template: `
         <exe-counter [count]="initialCount"></exe-counter>
         `
        })
        export class AppComponent {
         initialCount: number = 5;
        }

        @Input(‘bindingPropertyName’)

        Input 裝飾器支持一個可選的參數,用來指定組件綁定屬性的名稱。如果沒有指定,則默認使用 @Input 裝飾器,裝飾的屬性名。具體示例如下:

        counter.component.ts

        import { Component, Input } from '@angular/core';
        @Component({
         selector: 'exe-counter',
         template: `
         <p>當前值: {{ count }}</p>
         <button (click)="increment()"> + </button>
         <button (click)="decrement()"> - </button>
         `
        })
        export class CounterComponent {
         @Input('value') count: number = 0;
        ... // 其余代碼未改變
        }

        app.component.ts

        import { Component } from '@angular/core';
        @Component({
         selector: 'exe-app',
         template: `
         <exe-counter [value]="initialCount"></exe-counter>
         `
        })
        export class AppComponent {
         initialCount: number = 5;
        }

        setter & getter

        setter 和 getter 是用來約束屬性的設置和獲取,它們提供了一些屬性讀寫的封裝,可以讓代碼更便捷,更具可擴展性。通過 setter 和 getter 方式,我們對類中的私有屬性進行了封裝,能避免外界操作影響到該私有屬性。此外通過 setter 我們還可以封裝一些業務邏輯,具體示例如下:

        counter.component.ts

        import { Component, Input } from '@angular/core';
        @Component({
         selector: 'exe-counter',
         template: `
         <p>當前值: {{ count }} </p>
         <button (click)="increment()"> + </button>
         <button (click)="decrement()"> - </button>
         `
        })
        export class CounterComponent {
         _count: number = 0; // 默認私有屬性以下劃線開頭,不是必須也可以使用$count
         biggerThanTen: boolean = false;
         @Input()
         set count (num: number) {
         this.biggerThanTen = num > 10;
         this._count = num;
         }
         get count(): number {
         return this._count;
         }
         increment() {
         this.count++;
         }
         decrement() {
         this.count--;
         }
        }

        ngOnChanges

        當數據綁定輸入屬性的值發生變化的時候,Angular 將會主動調用 ngOnChanges 方法。它會獲得一個 SimpleChanges 對象,包含綁定屬性的新值和舊值,它主要用于監測組件輸入屬性的變化。具體示例如下:

        import { Component, Input, SimpleChanges, OnChanges } from '@angular/core';
        @Component({
         selector: 'exe-counter',
         template: `
         <p>當前值: {{ count }}</p>
         <button (click)="increment()"> + </button>
         <button (click)="decrement()"> - </button>
         `
        })
        export class CounterComponent implements OnChanges{
         @Input() count: number = 0;
         ngOnChanges(changes: SimpleChanges) {
         console.dir(changes['count']);
         }
         increment() {
         this.count++;
         }
         decrement() {
         this.count--;
         }
        }

        上面例子中需要注意的是,當手動改變輸入屬性的值,是不會觸發 ngOnChanges 鉤子的。

        Output 是屬性裝飾器,用來定義組件內的輸出屬性。前面我們介紹了 Input 裝飾器的作用,也了解了當應用啟動時,Angular 會從根組件開始啟動,并解析整棵組件樹,數據由上而下流下下一級子組件。而我們今天介紹的 Output 裝飾器,是用來實現子組件將信息通過事件的形式通知到父級組件。

        在介紹 Output 屬性裝飾器前,我們先來介紹一下 EventEmitter 這個幕后英雄。它用來觸發自定義事件,具體使用示例如下:

        let numberEmitter: EventEmitter<number> = new EventEmitter<number>(); 
        numberEmitter.subscribe((value: number) => console.log(value));
        numberEmitter.emit(10);

        在 Angular 中的 EventEmitter 應用場景是:

        子指令創建一個 EventEmitter 實例,并將其作為輸出屬性導出。子指令調用已創建的 EventEmitter 實例中的 emit(payload) 方法來觸發一個事件,父指令通過事件綁定 (eventName) 的方式監聽該事件,并通過 $event 對象來獲取 payload 對象。是不是感覺有點抽象,我們馬上實戰一下。

        @Output()

        counter.component.ts
        import { Component, Input, Output, EventEmitter } from '@angular/core';
        @Component({
         selector: 'exe-counter',
         template: `
         <p>當前值: {{ count }}</p>
         <button (click)="increment()"> + </button>
         <button (click)="decrement()"> - </button>
         `
        })
        export class CounterComponent {
         @Input() count: number = 0;
         @Output() change: EventEmitter<number> = new EventEmitter<number>();
         increment() {
         this.count++;
         this.change.emit(this.count);
         }
         decrement() {
         this.count--;
         this.change.emit(this.count);
         }
        }

        app.component.ts

        import { Component } from '@angular/core';
        @Component({
         selector: 'exe-app',
         template: `
         <p>{{changeMsg}}</p> 
         <exe-counter [count]="initialCount" 
         (change)="countChange($event)"></exe-counter>
         `
        })
        export class AppComponent {
         initialCount: number = 5;
         changeMsg: string;
         countChange(event: number) {
         this.changeMsg = `子組件change事件已觸發,當前值是: ${event}`;
         }
        }

        @Output(‘bindingPropertyName’)

        Output 裝飾器支持一個可選的參數,用來指定組件綁定屬性的名稱。如果沒有指定,則默認使用 @Output 裝飾器,裝飾的屬性名。具體示例如下:

        counter.component.ts

        import { Component, Input, Output, EventEmitter } from '@angular/core';
        @Component({
         selector: 'exe-counter',
         template: `
         <p>當前值: {{ count }}</p>
         <button (click)="increment()"> + </button>
         <button (click)="decrement()"> - </button>
         `
        })
        export class CounterComponent {
         @Input() count: number = 0;
         @Output('countChange') change: EventEmitter<number> = new EventEmitter<number>();
        ... // 其余代碼未改變
        }

        app.component.ts

        import { Component } from '@angular/core';
        @Component({
         selector: 'exe-app',
         template: `
         <p>{{changeMsg}}</p> 
         <exe-counter [count]="initialCount" 
         (countChange)="countChange($event)"></exe-counter>
         `
        })
        export class AppComponent {
         initialCount: number = 5;
         changeMsg: string;
         countChange(event: number) {
         this.changeMsg = `子組件change事件已觸發,當前值是: ${event}`;
         }
        }

        雙向綁定

        在介紹雙向綁定之前,我們先來說個需求:即在 CounterComponent 子組件 count 值發生變化的時候,需同步更新 AppComponent 父組件中的 initialCount 的值。通過上面的實例,我們知道我們可以在 AppComponent 父組件中監聽 CounterComponent 子組件的 change 事件,然后在 change 事件中更新 initialCount 的值。具體示例如下:

        counter.component.ts

        import { Component, Input, Output, EventEmitter } from '@angular/core';
        @Component({
         selector: 'exe-counter',
         template: `
         <p>子組件當前值: {{ count }}</p>
         <button (click)="increment()"> + </button>
         <button (click)="decrement()"> - </button>
         `
        })
        export class CounterComponent {
         @Input() count: number = 0;
         @Output() change: EventEmitter<number> = new EventEmitter<number>();
         increment() {
         this.count++;
         this.change.emit(this.count);
         }
         decrement() {
         this.count--;
         this.change.emit(this.count);
         }
        }

        app.component.ts

        import { Component } from '@angular/core';
        @Component({
         selector: 'exe-app',
         template: `
         <p>父組件當前值:{{ initialCount }}</p> 
         <exe-counter [count]="initialCount" 
         (change)="initialCount = $event"></exe-counter>
         `
        })
        export class AppComponent {
         initialCount: number = 5;
        }

        其實雙向綁定是由兩個單向綁定組成:

        模型 -> 視圖數據綁定

        視圖 -> 模型事件綁定

        Angular 中 [] 實現了模型到視圖的數據綁定,() 實現了視圖到模型的事件綁定。把它們兩個結合在一起 [()] 就實現了雙向綁定。也被稱為 banana in the box 語法。

        [()] 語法示例

        counter.component.ts

        import { Component, Input, Output, EventEmitter } from '@angular/core';
        @Component({
         selector: 'exe-counter',
         template: `
         <p>子組件當前值: {{ count }}</p>
         <button (click)="increment()"> + </button>
         <button (click)="decrement()"> - </button>
         `
        })
        export class CounterComponent {
         @Input() count: number = 0;
         // 
        輸出屬性名稱變更: change -> countChange @Output() countChange: EventEmitter<number> = new EventEmitter<number>(); ... // 其余代碼未改變 }

        app.component.ts

        import { Component } from '@angular/core';
        @Component({
         selector: 'exe-app',
         template: `
         <p>父組件當前值:{{ initialCount }}</p> 
         <exe-counter [(count)]="initialCount"></exe-counter>
         `
        })
        export class AppComponent {
         initialCount: number = 5;
        }

        從上面可以看出,[(modelName)] 可以拆分成兩部分 modelName 和 modelNameChange ,[modelName] 用于綁定輸入屬性,(modelNameChange) 用于綁定輸出屬性。當 Angular 在解析模板時,遇到 [(modelName)] 形式的綁定語法,它會期待這個指令中會存在一個名為 modelName 的輸入屬性和一個名為 modelNameChange 的輸出屬性。

        ngModel

        使用過 Angular 1.x 的讀者,應該很熟悉 ng-model 這個指令,我們通過它來實現數據的雙向綁定。那么在 Angular 中有對應的指令么 ?答案是有滴,它就是 ngModel 指令。

        ngModel雙向綁定示例

        import { Component } from '@angular/core';
        @Component({
         selector: 'exe-app',
         template: `
         <p>你輸入的用戶名是:{{ username }}</p> 
         <input type="text" [(ngModel)]="username" />
         `
        })
        export class AppComponent {
         username: string = '';
        }

        ngModel表單驗證示例

        import { Component } from '@angular/core';
        @Component({
         selector: 'exe-app',
         styles:[
         `.error { border: 1px solid red;}`
         ],
         template: `
         <p>你輸入的用戶名是:{{ username }}</p>
         <input type="text" 
         [(ngModel)]="username" 
         #nameModel="ngModel" 
         [ngClass]="{error: nameModel.invalid}"
         required/>
         {{nameModel.errors | json}}
         `
        })
        export class AppComponent {
         username: string = '';
        }

        以上示例利用 @Directive 指令 metadata 信息中的 exportAs 屬性,獲取 ngModel 實例,進行獲取控件的狀態,控件狀態分類如下:

        valid - 表單值有效

        pristine - 表單值未改變

        dirty - 表單值已改變

        touched - 表單已被訪問過

        untouched - 表單未被訪問過

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        Angular中Input和Output的介紹(附代碼)

        Angular中Input和Output的介紹(附代碼):本篇文章給大家帶來的內容是關于Angular中Input和Output的介紹(附代碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。Input 是屬性裝飾器,用來定義組件內的輸入屬性。在實際應用場合,我們主要用來實現父組件向子組件傳遞數據。Ang
        推薦度:
        標簽: 代碼 input output
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲国产日韩一区高清在线| 午夜国产羞羞视频免费网站| 亚洲精品国产精品乱码视色| 亚洲国产免费综合| 亚洲国产成人久久精品99| 男女猛烈xx00免费视频试看| 免费在线观看中文字幕| 亚洲av午夜电影在线观看| 在线观看91精品国产不卡免费| 国产成人亚洲毛片| 2022中文字字幕久亚洲| 中出五十路免费视频| 亚洲va中文字幕无码久久| 67pao强力打造高清免费| 亚洲午夜在线一区| 成人激情免费视频| 国产午夜亚洲精品不卡电影| 国产亚洲日韩在线三区| 免费网站看av片| 亚洲乱码在线播放| 国产男女猛烈无遮档免费视频网站| 猫咪免费人成在线网站 | 免费看黄福利app导航看一下黄色录像| 国产成人高清精品免费鸭子| 一区二区3区免费视频| 亚洲AV无码一区东京热久久 | 成年人视频在线观看免费| 国产亚洲福利一区二区免费看| 久久影院亚洲一区| 亚洲免费视频播放| 婷婷亚洲综合一区二区| 亚洲国产精品无码久久久蜜芽| 久久九九兔免费精品6| 精品在线免费视频| 亚洲AV无码乱码在线观看裸奔| 最近最新的免费中文字幕| 精品国产呦系列在线观看免费| 亚洲精品国产情侣av在线| 国产精品免费视频播放器| 永久免费av无码入口国语片| 亚洲小说图区综合在线|