プログラマー VTuber 衣亥栖ティオのちょっとした話

Youtubeに投稿したプログラミング学習動画の補足説明をするためのブログです。

プログラマーへの道 #29 の補足説明

こんにちは、プログラマーVTuberの衣亥栖ティオです。
今回は以下の動画の補足説明をします。 動画内で実装したソースコードも載せています。


今回の動画で実装したソースコード

以下が今回実装したソースコードです。

コードのコピペについて

現在実装中のメモ帳アプリでは同じようなコードをコピペして複数箇所で利用しています。 例えば以下のような現在時刻を取得する処理です。 現在このコードは2箇所に存在します。

const now = new Date()
const updatedAt = now.getFullYear() + "-" + (now.getMonth() + 1) + "-" + now.getDate()

同じようなコードが複数箇所に存在すると、そのコードを修正する際に複数箇所を修正しなければいけません。 例えば日付のフォーマットを変更する場合、2箇所のコードを修正する必要があります。 そのため、同じようなコードは関数でまとめるのがセオリーです。

function getCurrentDate() {
    const now = new Date()
    return now.getFullYear() + "-" + (now.getMonth() + 1) + "-" + now.getDate()
}

これによって日付のフォーマットを変更する際に getCurrentDate() という関数を修正するだけで済みます。

動画では "とりあえず動くものを作る" という方針なので、 今まで通りコピペで実装を進めていきますが、 メモ帳アプリが完成したタイミングで↑のようなプログラムの修正を加えていく予定です。

モーダルを閉じる方法

hide() を利用することでモーダルを閉じることができます。

Modal · Bootstrap v5.1

モーダルを操作するオブジェクトの定義方法について

動画でモーダルを閉じる際に上手く行かなかった点について補足します。 動画では以下のようなコードを書きましたが、うまくいきませんでした。

const updateButton = document.getElementById("id-update-button")
updateButton.addEventListener("click", (event) => {
    
    //省略

    //これは上手く動かなかった。
    const myModal = new bootstrap.Modal(document.getElementById('exampleModal'))
    myModal.hide()
})

しかし、myModal という変数をグローバル変数にするとうまくいきました。

<script>
  const titleElement = document.getElementById("id-title")
  const bodyElement = document.getElementById("id-body")

  //以下のように定義した myModal はどこからでも参照できるので、グローバル変数となる。
  const myModal = new bootstrap.Modal(document.getElementById('exampleModal'))

なぜ最初の方法がうまく動かなかったのかというと、 new bootstrap.Modal() によって生成されるモーダルのオブジェクトはモーダルの状態を管理しているからです。 モーダルには閉じている状態と開いている状態があります。 そのため、同じモーダルのオブジェクトに対して show(), hide() を実行しないと上手く動かなくなってしまいます。

以下の更新ボタンで作ったモーダルオブジェクトと

const updateButton = document.getElementById("id-update-button")
updateButton.addEventListener("click", (event) => {
    
    //省略

    const myModal = new bootstrap.Modal(document.getElementById('exampleModal'))
    myModal.hide()
})

以下の編集ボタンで作ったモーダルオブジェクトは異なるオブジェクトとなります。

const editButton = document.getElementById(editButtonId)
editButton.addEventListener("click", (event) => {
    //省略

    const myModal = new bootstrap.Modal(document.getElementById('exampleModal'))
    myModal.show()
})

そのため、更新ボタンを押した際に myModal.hide() を実行していますが、 それは開いたモーダルとは別のオブジェクトに対して閉じる操作をしたことになるので、 開いたモーダルは反応しませんでした。