コピー const getRandomName = () => {
// 1~5のランダムな番号を取得する。
const i = Math.floor(Math.random() * 5);
// ランダムな番号に該当する要素を名前として利用する。
return ["John Do", "Jane Doe", "Taro Yamada", "Hanako Suzuki", "Saburo Tanaka"][i];
}
// Proxyを使った独自のMVVMバインディング用関数
// ※ ProxyはIE11では動かないので注意
// SEE: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy
// SEE: https://caniuse.com/#search=proxy
const mount = (data) => {
// 要素の参照の保存先オブジェクト
let $refs = {}
const model = new Proxy(data, {
// dataに値が代入された時に呼ばれる処理を定義
set(obj, prop, newval) {
// オブジェクトに値をセットする(デフォルトの挙動)
obj[prop] = newval;
// もし関連する要素が存在するなら
if ($refs[prop]) {
// 値を書き換える。(Model -> Viewの反映)
$refs[prop].$el.val(newval);
}
// trueを返すことで、正常終了として扱われる。
return true;
}
});
// キー名(prop)と対応する要素のinputイベントハンドラをセットする。
for (const prop in data) {
// もし当該の要素が見つからなかったら無視する。
const $el = $(`input#${prop}`)
if ($el.length > 0) {
// イベントハンドラ()
const handler = (event) => {
model[prop] = event.target.value;
console.log('input', prop, model[prop]);
}
// イベントハンドラを登録(View -> Modelの反映)
$el.on("input", handler)
$refs[prop] = {
$el,
// イベントハンドラの削除用関数を定義しておく。
unmount: () => $el.off("input", handler)
}
}
}
console.log('mounted!');
return {
model,
unmount () {
// イベントハンドラの削除用関数を呼び出すことで、登録したinputイベントハンドラをすべて削除する。
for (const prop in $refs) {
$refs[prop].unmount()
}
console.log('unmounted...');
}
};
};
$(() => {
const { model, unmount } = mount({
name: "Taro Yamada",
firstFriendName: "Jiro Yamada",
secondFriendName: "Saburo Yamada"
});
// 各要素への参照を取得。
const $form = $("#form");
const $random = $("#random");
// ボタンのクリック(click)イベントにイベントリスナー(ハンドラー)を登録
$random.on("click", (event) => {
// デフォルトのフォーム送信の動きを止める(prevent)
event.preventDefault();
// ランダムな番号に該当する要素をそれぞれの名前として利用する。
model.name = getRandomName();
model.firstFriendName = getRandomName();
model.secondFriendName = getRandomName();
});
// form要素の送信(submit)イベントにイベントリスナー(ハンドラー)を登録
$form.on("submit", (event) => {
// 1. デフォルトのフォーム送信の動きを止める(prevent)
event.preventDefault();
// 2. モデルのnameの最新の値(= 入力値)を取得。
const data = model;
// 3. AJAXを使ってデータ送信する。
$.ajax({
// 送信先のURL(HTMLのform要素のactionに相当する部分)
url: "https://httpbin.org/anything",
// 送信するデータ。デフォルトでは "GET" リクエストなので、クエリ文字列(パラメータ)として付与される。
data: data
}).then((response) => {
// id="result"な要素のテキストを取得したAPIのレスポンスで置き換える。
$("#result").text(JSON.stringify(response));
});
});
// unmountを呼び出すと、以降は値が更新されなくなる。
// unmount();
});