jQueryとAjax使ってforでループしながらigComboの中身を初期化したいよっていうお話
今までのソースが「success」「error」っていう古い非推奨の書き方だったのと、各コンボBOX毎にAjaxの記述があって冗長的だったので整理も兼ねて。
$("#hoge1").igCombo({ textKey: "hogeKey1", valueKey: "hogeVal" }); $("#hoge2").igCombo({ textKey: "hogeKey2", valueKey: "hogeVal" }); (中略) // ajaxによるコンボBOX設定 // urlはコントローラのRequestMapping // 初期値指定がある場合にも対応したかった var requestHdr = [ { url: $("#contextPath").val() +"/hoge/getHoge1", id: "#hoge1", defaultVal: ""}, { url: $("#contextPath").val() +"/hoge/getHoge1", id: "#hoge2", defaultVal: "ALL"} ]; var jqXHRListHdr = []; // 実行するAjaxを格納する配列 for (var i = 0; i < requestHdr.length; i++) { jqXHRListHdr.push( $.ajax({ type : "POST", data : JSON.stringify(jsonData), url : requestHdr[i].url, // 配列で指定したurlを順次受け取る cache : false, contentType : 'application/json', async : false, scriptCharset : 'utf-8' }) .then( // 通信成功時のコールバック function(data) { $(requestHdr[i].id).igCombo("option", "dataSource", data); // 初期値が指定されている場合はその値を設定 if (requestHdr[i].defaultVal != "") { $(requestHdr[i].id).igCombo("value", requestHdr[i].defaultVal); } }, // 通信失敗時のコールバック function(xhr, textStatus, errorThrown) { var errorInfo = $.parseJSON(xhr.responseText); location.href($("#contextPath").val() +"/sysError/"+ errorInfo.errNo +"/"+ errorInfo.errDate +"/"+ errorInfo.errContents); } ) ); } // ajaxによる処理を実行 // $.when関数にてまとめてAjax通信を実施 $.when(jqXHRListHdr).done(function () { console.log("通信成功"); 後続処理(); }).fail(function (ex) { console.log("Ajax通信に失敗しました"); });
とりあえずこんな感じで上手く設定はできた。
ただ、どうせ全通信の完了を待つなら「async : false」を取ればいいやと思いコメントアウトすると初期化ができなくなった。
どうやら
同期の場合 :.thenの中身まで実行→後続処理の実行
非同期の場合:後続処理の実行→.thenの中身実行
って順序になるみたい。
whenの前に.thenの処理を実行できるように記述してあげる必要があるみたいだけど、とりあえず今日は時間無くなっちゃったからここまで。
明日また頑張る。
【IgniteUI】formの内容をserializeObjectで取得する際のメモ
先日とある改修案件の対応をした際のメモ。
Spring MVCとIgniteUIを用いて構築された画面のフォーム操作。
var formData = $("#form").serializeObject();
こんな感じでフォームの内容を取得して変数にセットしようとした際、Stringで設定したかったあるinputの内容がArrayになってしまった。
今まではStringで取れていたのに…と悩んでいたところ、どうやら無効化がうまく動いておらず重複した項目が渡ってしまったため、勝手にArrayにされてしまった模様。
jspはこんな感じ。
<form:hidden path="From" id="hidFrom" /> (中略) <form:input path="From" class="textCss ime-disabled" id="txtFrom" />
生成された2つのinputのnameが重複していたため、serializeObjectした際に同一項目とみなされた模様。
pathの値を元に勝手にnameつけてくれるもんなの…?
なので、片方殺してあげればいいよねってことで
$("#txtFrom").attr("disabled", true);
な感じで記述したら死なない。
正確に言うと、Textbox自体は死んでるんだけど勝手に作られたhiddenのinputが生きたままになってる。
IgniteUIのinputって、実際に入力するinputの直後にhiddenのinputを生成して、そこで値持つのね…。
悩んだ結果殺し方間違ってるじゃん、と。
IgniteUIのinputはそれ用の記述でプロパティ指定してあげないといけない模様。
$("#txtFrom").igTextEditor({ disabled : true });
こうすることで正しく殺せてArrayにもならず想定した値が飛ぶようになりましたとさ。
【Chrome拡張】webページの背景を変更するアドオン
作りました。
以前業務上で検証環境にて行う作業を本番で行う事があったんですけど、うっかり本番で実施するって事故がありました。
なので本番環境の背景を強制的に警告色に変えとけば少しでも防げるよねってことで作ったんですけど、URLも背景も固定だったんで汎用的にしたものをストア公開しました。
使い方は…オプション開けば直感的に使える…はず…。
chrome.google.com
(以前公開したソースはこちら)
forgeserem.hatenablog.com
業務上の事故ってどうしても100%防ぐのって難しいですよね。
施策は色々あると思うので組み合わせで実施するしかないと思うんですけど、結局は指差し確認が一番効果的なんじゃないかっていうアナログ感。
これで少しでも業務上の事故が減りますように。
GoogleカレンダーへのCSVを用いた予定登録
不定期な予定って一個一個ポチポチ予定登録するの面倒なのでCSVでインポートしようってことで思い立ったけど、思うようにいかなかったのでMEMO。
結論から言うと、時間はGMT表記として認識されるので9時間ずらそうねっていうお話。
ヘッダは以下。
Subject,Start date,Start time,End Date,End Time
最低限頭の3つがあれば登録可能。
んでこのヘッダで、7/19 15:00~19:00の予定を追加する場合、
予定タイトル,07/19/2018,15:00,07/19/2018,19:00
これで登録すると、7/20 0:00~7/20 4:00で登録されちゃう。
なので9時間遡って
予定タイトル,07/19/2018,6:00,07/19/2018,10:00
って入力すると正しく登録される。
タイムゾーン設定してるんだから日本時間で読み取ってくれてもいいのに…!
7/20追記
まさかの遡った時間になってなかったっていう誤記…w
あ、あと文字コードはsjisだと化けるのでUTF-8に変換するのをお忘れなく。
詳細は以下で。
https://support.google.com/calendar/answer/37118?hl=ja