Angular - Event Binding - 2

  • 517
  • 0
  • 2018-05-08

介紹稍微進階一點的 Event Binding的用法

最近在上保哥的線上Angular課程的時候,有介紹到比較進階的Event Binding的用法

把他記錄下來

之前的文章有介紹過 Event Binding 的基礎用法

 

情境說明:

提供一個TextBox 讓使用者輸入文字,輸入完之後直接在右邊顯示目前正在輸入的字元數。

當使用者在輸入框按下 Escape 按鍵時,會自動清空輸入框的內容。

 

實作說明 方法一:

開一個新的Component,開啟之後我先在component.ts內寫要實作的邏輯,

在component.ts內我寫了兩個對應的function 

第一個是changeword 事件,當使用者輸入文字之後我就要改變firstKeyWord的值,畫面上字元的數量就會自動改變

第二個是使用者輸入的是Escape鍵要對應的function,要清空畫面上的資料,所以需要將整個TextBox的target傳到ts來

export class Demo1Component implements OnInit {
  constructor() {}

  firstKeyWord = '';

  // 傳入使用者目前輸入的 value
  firstChangeWord(keyvalue: string) {
    this.firstKeyWord = keyvalue;
  }

  // 
  firstCancelWord(input: HTMLInputElement) {
    input.value = '';
    this.firstKeyWord = '';
  }

  ngOnInit() {}
}

接著開始寫template:

這邊的用法就是Angular比較獨特的用法,透過Event Filter去註冊兩個以上的keyup事件

除了畫面上使用的(keyup)、(keyup.escape) 之外,也可以寫(keyup.enter),

(keyup.escape) => 當使用者輸入Escape鍵的時候才會觸發!

<dir>
    <input type="text" name="" id="" placeholder="請輸入關鍵字" 
    (keyup)="firstChangeWord($event.target.value)" 
    (keyup.escape)="firstCancelWord($event.target)"  >
    <span>目前字元:{{firstKeyWord.length}}</span>
</dir>

這樣就可以完成我們目前的需求,以上是第一個做法

 

實作說明 方法二:

我在component.ts內只寫一個方法,

從前端傳整個DOM 到component.ts 來,

然後我在ts這邊去判斷key值是不是特定的值,再去做邏輯判斷

  secondKeyWord = '';

  // 如果是傳整個Event的話,這邊建議明確定義型別
  secondChangeWord($event: KeyboardEvent) {
    
    //將target 轉型為 HTMLInputElement
    const _target = $event.target as HTMLInputElement;

    if ($event.key === 'Escape') {
      _target.value = '';
    }
    this.secondKeyWord = _target.value;
  }

template的寫法:

<dir>
    <input type="text" name="" id="" placeholder="請輸入關鍵字" (keyup)="secondChangeWord($event)">
    <span>目前字元:{{secondKeyWord.length}}</span>
</dir>

這樣也可以達到一樣的效果!