preloader
心得

How to Use ion-checkbox Within Ionicv4 and angular template-driven form | 如何在 ionicv4 和 Angular 環境使用 ion-checkbox

How to Use ion-checkbox Within Ionicv4 and angular template-driven form | 如何在 ionicv4 和 Angular 環境使用 ion-checkbox

ionic v4 with angular v7 環境使用 ion-checkbox 元件,有一些地方要注意,本文章分享我的使用經驗。如果在 ionic v4angular v7 環境,想用 ion-checkbox 和 angular 的 template-driven form 方式做表單選項的勾選元件,例如顯示使用者上次勾選的檔案簽名人需要有誰,這功能的流程需要先讀入後端資料,再設定畫面上的 ion-checkbox 值,就很適合使用下面這個方法。

HTML 檔案:


<article>
    <!-- ....(略) -->
</article>

<div class="container list-signers">
    <span *ngFor="let signer of signers; index as idx">
        <ion-checkbox [checked]="signed.toSign" (ionChange)="onIonChange($event, idx)" id="name-{{idx}}">
        <label for="name-{{idx}}">{{ signer.name }}</label>
    </span>
</div>

  TS 檔案 :


  // 資料變數宣告
  signers: unknown[] = [
    {
        name: '大明1',
        toSign: true, // 需要簽
    },
    {
        name: '大明2',
        toSign: false, // 不需要簽
    },
    {
        name: '大明3',
        toSign: true,
    },
  ];


  // ...(略)

  onIonChange($event, idx) {

    // 如果傳進來的已勾選值相同於項目本身的 toSign 值, 則不需修改
    if ($event.target.checked === this.signers[idx].toSign) return // <- IMPORTANT

    /**
     * Notice: 因為教學懶得 import ChangeDetectionRef., 所以用 js 的 map(),
     * 強制改變 variable 的記憶體位置,令 angular 自動更新 html 畫面。
     * 好孩子不要學, 如果可以請善用 angular 生態系的機制。
     */
    this.signers = this.signers.map((elem, idx1) => {
        if (idx === idx1) {
            // 找到相同項目,並修改它的已勾選狀態
            elem.toSign = $event.target.checked
        }

        return elem
    })
  }

    如果你很確定功能畫面的初始狀態,都是未勾選的 ion-checkbox,而且也想使用 Angular template-driven form 方式,那麼用以下方式會更簡單:
HTML 檔案:

<article>
    <!-- ....(略) -->
</article>

<div class="container list-signers">
    <span *ngFor="let signer of signers; index as idx">
        <ion-checkbox [(ngModel)]="signer.toSign" [ngModelOptions]="{standalone: true}" id="name-{{idx}}">
        <label for="name-{{idx}}">{{ signer.name }}</label>
    </span>
</div>

  TS 檔案:


  // 資料變數宣告
  signers: unknown[] = [
    {
        name: '大明1',
        toSign: false, // 不需要簽
    },
    {
        name: '大明2',
        toSign: false, 
    },
    {
        name: '大明3',
        toSign: false,
    },
  ];

 

在 angular 的 reactive-driven form 搭配 ion-checkbox,則如一般 angular 的使用方式,只要照 angular 官方方式做就好。