Javascript-форум (https://javascript.ru/forum/)
-   Backbone.js (https://javascript.ru/forum/backbone/)
-   -   backbone-validate не срабатывает (https://javascript.ru/forum/backbone/63293-backbone-validate-ne-srabatyvaet.html)

zlodiak 29.05.2016 15:36

backbone-validate не срабатывает
 
помогите пожалуйста понять почему backbone-validate отказывается валидировать форму

я сделал следующее:
в форме имеется набор полей. правила валидации прописаны в модели:
APP.PlaceModel = Backbone.Model.extend({

  defaults: {
    idPlace: undefined,
    length: undefined,
    width: undefined,
    height: undefined,
    volume: undefined,
    weight: undefined,
    overCargo: undefined,
    hardBox: undefined         
  }, 

  validation: {

    length: [ 
              { required: true, msg: 'Поле не может быть пустым' },
              { pattern: 'number', msg: 'Введите число' },
              { pattern: /^[0-9]\d*(\.\d+)?$/, msg: 'Введите положительное число' },
              { pattern: /^[1-9]\d*(\.\d+)?$/, msg: 'Число не может быть нулём' }
            ],     

    width:  [ 
              { required: true, msg: 'Поле не может быть пустым' },
              { pattern: 'number', msg: 'Введите число' },
              { pattern: /^[0-9]\d*(\.\d+)?$/, msg: 'Введите положительное число' },
              { pattern: /^[1-9]\d*(\.\d+)?$/, msg: 'Число не может быть нулём' }
            ],    

    height: [ 
              { required: true, msg: 'Поле не может быть пустым' },
              { pattern: 'number', msg: 'Введите число' },
              { pattern: /^[0-9]\d*(\.\d+)?$/, msg: 'Введите положительное число' },
              { pattern: /^[1-9]\d*(\.\d+)?$/, msg: 'Число не может быть нулём' }
            ],    

    volume: [ 
              { required: true, msg: 'Поле не может быть пустым' },
              { pattern: 'number', msg: 'Введите число' },
              { pattern: /^[0-9]\d*(\.\d+)?$/, msg: 'Введите положительное число' },
              { pattern: /^[1-9]\d*(\.\d+)?$/, msg: 'Число не может быть нулём' }
            ],    

    weight: [ 
              { required: true, msg: 'Поле не может быть пустым' },
              { pattern: 'number', msg: 'Введите число' },
              { pattern: /^[0-9]\d*(\.\d+)?$/, msg: 'Введите положительное число' },
              { pattern: /^[1-9]\d*(\.\d+)?$/, msg: 'Число не может быть нулём' }
            ]                                    
                                                 
  }       

});


после того как пользователь кликает по кнопке submit происходит валидация:
events:{
    'click #submitBtn' : 'submit',
    'click #addPlaceBtn' : 'addPlace'
  },

  submit: function() { 
    var validationSuccess = true, 
        data = this.$el.find('#shippForm').serializeObject();

    console.log(data, 'data')

       

    APP.placesCollection.each(function(model) { 
        model.set(data); 
        console.log(model, 'model')
        console.log(model.isValid('length'), 'is valid length')
        console.log(model.isValid(true), 'is valid model')

        for(attr in model.attributes) {   
            if((attr != 'idPlace') && (attr != 'hardBox') && (attr != 'overCargo')) {   
                console.log(model.isValid(attr), attr)

                if(!model.isValid(attr)) {                  
                    validationSuccess = false;
                };
            };            
        }        
    }, this ); 

    console.log(validationSuccess)

    //$('#paymentModal').modal('show');
  },


проблема в том, что все методы isValid() высегда возвращают true(даже для явно неввалидной формы - не заполненной). это хорошо видно по выводу в консоли

мне это не понятно:-?

полная версия тут: https://github.com/zlodiak/shipping_form
живая страничка тут: http://fh79272k.bget.ru/files/works/shipping_form/1/

destus 29.05.2016 16:58

zlodiak,
Биндинг между вьюхой и коллекцией забыл. В файле formView.js метод initialize перепиши так
initialize: function() {    
    APP.placesCollection = new APP.PlacesCollection();
        Backbone.Validation.bind(this, {
      collection: APP.placesCollection
    });	
    this.place = new APP.PlaceView(false);     

    new APP.PaymentModalView();
	
    this.render();
  }

zlodiak 29.05.2016 20:51

Цитата:

Сообщение от destus (Сообщение 417938)
zlodiak,
Биндинг между вьюхой и коллекцией забыл. В файле formView.js метод initialize перепиши так
initialize: function() {    
    APP.placesCollection = new APP.PlacesCollection();
        Backbone.Validation.bind(this, {
      collection: APP.placesCollection
    });	
    this.place = new APP.PlaceView(false);     

    new APP.PaymentModalView();
	
    this.render();
  }

спасибо, так и есть

походу тут только мы бекбон мучаем

ps:
и всё таки странно. по сути здесь тот же самый код, но никакого биндинга не требовалось

destus 30.05.2016 03:14

Цитата:

Сообщение от zlodiak
ps:
и всё таки странно. по сути здесь тот же самый код, но никакого биндинга не требовалось

А это тогда что? Backbone.Validation.bind(this);


Часовой пояс GMT +3, время: 08:42.