2013-07-13 5 views
1

뷰에서 model.set() 메서드를 호출 할 때 validate 함수가 실행되어야합니다 ( ).하지만 아래 코드로 테스트 했으므로 모델에 정의 된 유효성 검사 함수를 호출하지 않습니다. 누구나 내가 뭘 잘못 알아?Backbone.js 모델 유효성 확인

<!doctype html> 
<html> 
<head> 
    <meta charset=utf-8> 
    <title>Form Validation - Model#validate</title> 
    <script src='http://code.jquery.com/jquery.js'></script> 
    <script src='http://underscorejs.org/underscore.js'></script> 
    <script src='http://backbonejs.org/backbone.js'></script> 
    <script> 
    jQuery(function($) { 

     var User = Backbone.Model.extend({ 
     validate: function(attrs) { 
      var errors = this.errors = {}; 

      console.log('This line is never called!!!'); 

      if (!attrs.firstname) errors.firstname = 'firstname is required'; 
      if (!attrs.lastname) errors.lastname = 'lastname is required'; 
      if (!attrs.email) errors.email = 'email is required'; 

      if (!_.isEmpty(errors)) return errors; 
     } 
     }); 

     var Field = Backbone.View.extend({ 
     events: {blur: 'validate'}, 
     initialize: function() { 
      this.name = this.$el.attr('name'); 
      this.$msg = $('[data-msg=' + this.name + ']'); 
     }, 
     validate: function() { 
      this.model.set(this.name, this.$el.val()); 
      //this.$msg.text(this.model.errors[this.name] || ''); 
     } 
     }); 

     var user = new User; 

     $('input').each(function() { 
     new Field({el: this, model: user}); 
     }); 

    }); 
    </script> 
</head> 
<body> 
    <form> 
    <label>First Name</label> 
    <input name='firstname'> 
    <span data-msg='firstname'></span> 
    <br> 
    <label>Last Name</label> 
    <input name='lastname'> 
    <span data-msg='lastname'></span> 
    <br> 
    <label>Email</label> 
    <input name='email'> 
    <span data-msg='email'></span> 
    </form> 
</body> 
</html> 

답변

3

백본 0.9.10부터 유효성 검사는 기본적으로 저장 될 때만 호출됩니다. 당신은 당신이 속성을 설정하는 때 확인해야 할 경우에는 {validate: true} 옵션을 통과해야합니다.

var Field = Backbone.View.extend({ 
    // .. 
    validate: function() { 
    this.model.set(this.name, this.$el.val(), {validate: true}); 
    //this.$msg.text(this.model.errors[this.name] || ''); 
    } 
}); 
+0

은 대단히 감사합니다! –