skillup

技術ブログ

JavaScript

ajaxがらみのイベントの発動とwhenに関して

投稿日:2019年3月24日 更新日:

実務で住所のプルダウンを実装する機会がありました。

[東京都][中央区][明石町]

みたいにカテゴリーが2〜3あって連動するプルダウンのパターンです。

これを実装するときのポイントですが、新規保存よりも編集の方が難しいです。

編集時には親の値を意識したプルダウンのリストを持っている必要があります。

今回でいうと[中央区]には市区町村のプルダウンが入ります。

このプルダウンは親(今回でいうと東京都、つまりは都道府県)に依存するため、親の値を意識したリストを持っている必要があります。

実装方法としては2つあります。

  1.  親の値を意識したプルダウンリストをプログラム側で保持しておく
  2.  画面読み込み時にJavaScriptで親の値を擬似的に選ぶ(changeイベントの発火)

1がスタンダードな方法ですが、項目数が少ない場合には2の方が簡単だったりします。

書き方ですが下記のような方法でいけます。

上記のような書き方でイベントが発火しますので、画面が読み込まれた時にJSが発動して、連動プルダウンが動きます。

注意点としてはプルダウンの連動の場合、非同期であることを忘れてはいけません。要は

[東京都][中央区][明石町]

のような場合、

都道府県のchangeイベントが発生し、それを受けて次に市区町村のchangeイベントが発生し、最後に町村のchangeイベントが発現します。

この場合、親のイベントが終わったことを受けて、子供がイベントをキャッチしないといけませんが、普通に下記のように書くと非同期のために親が終わらないうちに子の処理が始まってしまいます。

この場合、親の処理を終えた後に子の処理を動かしたい場合ですが、whenを使って下記のように書くことができます。

詳しい仕様は調べ中ですが、Promiseなどと近い感じで非同期処理をかけるようです。

これだとプログラム側で親の値を意識したプルダウンを書かなくてもいいので楽ですね。

欠点としては画面の項目数が多いとものすごい遅延してしまって、実用には耐えられないことですかね・・・今回の要件では結局10箇所ぐらいに同一のプルダウンがあったため、没になり、プログラム側でリストを作る手法を選びましたが覚えておいて損はなさそうです。

*注意点

上記の処理の場合、同一のイベントが画面内に複数ある場合、when〜以下の処理は関数でひとまとまりにしてあげないとうまく連動しません。(実行順番が保証されないようです。)

このように書いてはダメで、

下記のように書かないといけません。

参考URL

jQueryで、順番に実行が出来る .when() から .done() が便利だったのでメモ

 

 

-JavaScript
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

bowerのインストール

業務でAngularJSをいじっていますが、そこでbowerというソフトウェアの存在を知りました。 Contents1 bowerとは?2 インストール方法 bowerとは? フロントエンドのパッケー …

no image

timepickerについて

日付を入力するときに直接、文字入力するのがメンドイことからカレンダーが表示されるプラグインを使っている人は多いでしょう。 私も日頃Datepickerというライブラリを使っています。が、このプラグイン …

no image

新技術のメリットを理解したい場合(jQueryと比べた場合のVueのメリットなど)

Vueを昨年度ぐらいからコツコツと勉強しています。 正直、その理由の半分ぐらいは「流行っているから」というのが大きいですね(汗) エンジニアとしてはやはり新しい技術自体を追い求めること自体に「快感」の …

no image

Angular複数ファイルでの読み込み

Angularでいろいろな処理を書いているんですが、処理が膨らんでくると1つのファイルに全ての処理を書いていては当然非効率になります。 ざっくり分けると ほとんどの処理に共通な処理を集めたファイル 特 …

no image

requirejsでのモジュール読み込み

JavaScriptのモジュール化では2019年5月現在ではwebpackなどを使うことが一般的かと思いますが、以前はrequire.jsなどというライブラリがあったようです。 例えば下記のようなファ …