validateで引っかかった際にModelからエラーメッセージを受け取ってくる


前回に引き続きAlloyのModelについて書いていきます.

今回やったこと

  • validateに引っかかった際,任意のエラーメッセージをcontroller側で取得する

ソースコード(一部)

app/model/user.js
extendModel: function(Model) {
  _.extend(Model.prototype, {
    /* validateプロパティだけど呼び出す時はisValid() */
    validate: function(attrs){
      for(var key in attrs){
        var value = attrs[key];
        switch(key){
          case 'name':
            if(value.length <= 0 || 20 < value.length){
              this.errorMsg = '名前は1文字以上20文字以下です';
              return 'Error: name';
            }
            break;
          case 'age':
            if(value.length <= 0 || isNaN(value)){
              this.errorMsg = '年齢は数字のみです';
              return 'Error: age';
            }
            break;
          case 'email':
            if(!(/^[A-Za-z0-9]+[\w-]+@[\w\.-]+\.\w{2,}$/.test(value))){
              this.errorMsg = 'Eメールが正しくありません';
              return 'Error: email';
            }
            break;
        }
      }
    },
    errorMsg: ''
  });

  return Model;
}
app/controller/index.js
if(newUser.isValid()){
  newUser.save();
  alert('success');
  $.userName.setValue('');
  $.userAge.setValue('');
  $.userEmail.setValue('');
} else{
  alert(newUser.errorMsg);
}

今回は_.extendの第2引数内のvalidateと同じレベルでメッセージを格納しておく為のプロパティを宣言しておき,validateに引っかかった際にそこへエラーメッセージを格納するという方法を試してみました.
私が思いつくことなので,おそらくこれが一番簡単な方法なのかなと思います.(公式にもしかしたら何か書いてあると思いますが,あまり見てないので他の方法はわかりません)
結果的にもcontroller側でエラーメッセージを取得できたのでうまくいったのかなと思います.

シミュレータで確認

Image1
名前の部分を入力せずに「登録」を押すと
Image2
のようにアラートが出てきます.うまくいきました.:)
ついでに他の入力がvalidateで引っかかった場合は
Image3
Image4
こんな感じでエラーメッセージを取得してくることができました.