院卒新人サラリーマンのメモ代わり

備忘としてのメモを記載

ブレイクスルーjavascript

ブレイクスルーJavaScript フロントエンドエンジニアとして越えるべき5つの壁―オブジェクト指向からシングルページアプリケーションまで (WEB Engineer’s Books)

読み始めた。
初めの章のvalidateのやつを自分なりにリファクタリング

class AppModel {
  constructor() {
    this.val = "";
    this.validateList = {
      required: true,
      maxlength: 8,
      minlength: 4
    };
  }

  validate(input) {
    if (this.val === input) return;
    this.val = input;
    this.errors = [];
    for (let [key, value] of Object.entries(this.validateList)) {
      if (value && !this[key](value)) this.errors.push(key);
    }
  }

  //validateでboolen型を返すだけ
  required() {
    return this.val !== "";
  }

  maxlength(num) {
    return num >= this.val.length;
  }

  minlength(num) {
    return num <= this.val.length;
  }
}

class AppView {
  constructor(el) {
    this.$el = $(el);
    this.$list = this.$el.next().children();
    this.model = new AppModel();
    this.$el.on("keyup", (e) => {
      this.onKeyup(e);
    });
    //ドルを付けるとjQuert [0]を付けるとDOMになる
    // this.el = this.$el[0];
    // this.list = this.$list[0];
  }

  //キーボードが押されたらvalidateを実行
  onKeyup(e) {
    var inputValue = e.currentTarget.value;
    this.model.validate(inputValue);
    this.model.errors.length ? this.onInvalid() : this.onValid();
  }

  //$listはエラーのプロンプトが入ってる
  //まず、全部非表示にして、エラーのものだけ表示する
  onValid() {
    this.$el.removeClass("error");
    this.$list.hide();
  }

  onInvalid() {
    this.$el.addClass("error");
    this.$list.hide();
    this.model.errors.forEach(val => {
      this.$list.filter(`[data-error="${val}"]`).show();
    });
  }
}

document.querySelectorAll("input").forEach(input => {
  new AppView(input);
});