Javascript-форум (https://javascript.ru/forum/)
-   Backbone.js (https://javascript.ru/forum/backbone/)
-   -   почему форма всегда валидна? (https://javascript.ru/forum/backbone/63707-pochemu-forma-vsegda-validna.html)

zlodiak 24.06.2016 13:52

почему форма всегда валидна?
 
помогите пожалуйста понять почему форма получается всегда валидной

jsfiddle: http://jsfiddle.net/udXL5/629/

я использую плагин backbone-validation и бутстраповские модальные окна. в модели прописываю такие правила валидации:
APP.DiaryModel = Backbone.Model.extend({

  defaults: {
    title: undefined,
    desc: undefined
  },

  validation: {  
    title: [ 
              { required: true, msg: 'Поле не может быть пустым' },
              { minLength: 3,   msg: 'Введите не менее 3 символов' }
            ],    

    desc: [ 
              { maxLength: 200,   msg: 'Введите не более 200 символов' }
            ]                                                                                             
  }       

});


после того как я пытаюсь сабмитить форму с пустым полем #diaryTitle, я получаю в консоли следующее:

is v true true true
(index):164 valid   r {cid: "c3", attributes: Object, _changing: false, _previousAttributes: Object, changed: Object…}


то есть получается так что форма валидна(!). а в реальности она не валидна. потому что поле #diaryTitle пустое

код, отвечающий за валидацию в APP.DiariesView:

events:{
    'click #showAddDiaryModal' : 'showAddDiaryModal',
    'click #addDiaryBtn' : 'addDiary'
  }, 

  addDiary: function() { 
    var titleValue =  $.trim(this.$el.find('#diaryTitle').val()), 
        descValue =   $.trim(this.$el.find('#diaryDesc').val());

    var model = new APP.DiaryModel();

    model.set({
      title: titleValue,
      desc: descValue
    });  

    console.log('is v', model.isValid(), model.isValid('title'), model.isValid('desc'))

    if(model.isValid()) { 
      console.log('valid', titleValue, descValue, model)
    } else {
      console.log('invalid')
    };
    
  }

armidoll 25.06.2016 02:28

1. Model нужно инициализировать ДО биндинга ( http://jsfiddle.net/udXL5/632/ )
2. Валидация model при set() работает принудительно { validate : true } в отличие от save()
3. По умолчанию метод isValid() возвращал true при заданных аттрибутах ( посмотреть: console.log( model.isValid ); )
var model = new APP.DiaryModel();
    
    this.model = model
    
    Backbone.Validation.bind( this, {
        attributes : ['title', 'desc']
    } );

    model.set({
      title: titleValue,
      desc: descValue
    },
    {
    	validate: true
    });


обратил внимание на:
this.$el.find('#diariesListInner')

а что, такая запись не работает:
this.$('#diariesListInner')

?

zlodiak 27.06.2016 11:35

Цитата:

Сообщение от armidoll (Сообщение 420374)
1. Model нужно инициализировать ДО биндинга (
обратил внимание на:
this.$el.find('#diariesListInner')

а что, такая запись не работает:
this.$('#diariesListInner')

?

это просто привычка. дурная привычка

я так понял, что для того чтобы пользоваться плагином, нужно обязательно view присвоить модель таким образом:
this.model = model


потому что чуть позже в биндинге используется this:
Backbone.Validation.bind(this, {
      attributes : ['title', 'desc']
    });


правильно?

но в этом случае получается, чт оя неправильно спроектировал программу вообще. потому что APP.DiariesView это не APP.DiaryView и прописывать модель модель только для того чтобы заработал плагин это не правильно и является костылём...

armidoll 27.06.2016 14:09

Цитата:

Сообщение от zlodiak (Сообщение 420620)
я так понял, что для того чтобы пользоваться плагином, нужно обязательно view присвоить модель таким образом:
this.model = model


потому что чуть позже в биндинге используется this:
Backbone.Validation.bind(this, {
      attributes : ['title', 'desc']
    });


правильно?

Автор плагина пишет, что модель должна быть предварительно ИНИЦИАЛИЗИРОВАНА :

The validation binding code is executed with a call to Backbone.Validation.bind(view). There are several places that it can be called from, depending on your circumstances, but it must be called after your model or collection has been initialized.

( и доступные примеры использования это также подтверждают ), т.е. в нашем случае конструктор должен создать объект и о модели мы уже говорим, не как о конструкторе (классе), а как о возвращаемом объекте (экземпляре класса)

Тогда this.model = model годится если ссылается на экземпляр, а не на конструктор

(я так понял замысел автора)

Цитата:

Сообщение от zlodiak (Сообщение 420620)
но в этом случае получается, чт оя неправильно спроектировал программу вообще. потому что APP.DiariesView это не APP.DiaryView и прописывать модель модель только для того чтобы заработал плагин это не правильно и является костылём...

Да является костылём в данном учебном примере. Архитектуру лучше бы поменять.


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