本文へ移動
rdlabo.devdocs

deny-overlay-create

ModalController / PopoverControllerの .create() を禁止し、launcher経由でoverlayを開く。

  • ⭐️ このルールは plugin:@rdlabo/rules/recommended プリセットに含まれます。

このルールは、controllerの .create() 呼び出しによるIonic overlayの直接生成を防ぎます。rdlabo architectureでは、overlayはlauncher functionと共有の presentModal / presentPopover helperを通じて開きます。これによりoverlay logicを一元化し、呼び出し側をcontroller APIから分離できます。

ルール詳細

receiverが ModalControllerPopoverController(または設定した他のcontroller)である .create() 呼び出しを検出します。次のような複数のpatternからcontrollerを解決します。

  • this.modalCtrl.create()
  • modalCtrl.create()modalCtrlinject(ModalController) の場合)
  • inject(ModalController).create()
  • constructor parameter constructor(private modalCtrl: ModalController)
  • ModalController 型のclass property

LoadingControllerAlertControllerToastControllerActionSheetController など、その他のoverlay controllerは直接使うことが意図されている場合があるため、デフォルトでは禁止しません。

オプション

{
  "rules": {
    "@rdlabo/rules/deny-overlay-create": [
      "error",
      {
        "deny": ["ModalController", "PopoverController"]
      }
    ]
  }
}

deny

  • 型: string[]
  • デフォルト: ["ModalController", "PopoverController"]

.create() 呼び出しを禁止するcontroller class nameです。空の配列を指定するとルールを無効にできます。

誤り

export class ExamplePage {
  readonly #modalCtrl = inject(ModalController);

  async open() {
    await this.#modalCtrl.create({ component: OtherPage });
  }
}
export async function open(modalCtrl: ModalController) {
  await modalCtrl.create({ component: OtherPage });
}
export class ExamplePage {
  constructor(private modalCtrl: ModalController) {}

  async open() {
    await this.modalCtrl.create({ component: OtherPage });
  }
}

正しい

export const launchOtherPage = (overlay: Helper, props: Props) => {
  return overlay.presentModal(OtherPage, props);
};
export class ExamplePage {
  readonly #loadingCtrl = inject(LoadingController);

  async showLoading() {
    await this.#loadingCtrl.create({ message: '...' });
  }
}
export class ExamplePage {
  readonly #modalCtrl = inject(ModalController);

  dismiss(data?: unknown) {
    this.#modalCtrl.dismiss(data);
  }
}

有効にする場面

launcher patternと共有overlay helperを使うIonicプロジェクトで、このルールを有効にします。@rdlabo/rules/prefer-modal-launcherおよび@rdlabo/rules/deny-elementと組み合わせて使います。

関連項目

実装