Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 24.06.2016, 13:52
Кандидат Javascript-наук
Отправить личное сообщение для zlodiak Посмотреть профиль Найти все сообщения от zlodiak
 
Регистрация: 24.02.2012
Сообщений: 104

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

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')
    };
    
  }
Ответить с цитированием
  #2 (permalink)  
Старый 25.06.2016, 02:28
Аватар для armidoll
Кандидат Javascript-наук
Отправить личное сообщение для armidoll Посмотреть профиль Найти все сообщения от armidoll
 
Регистрация: 28.05.2015
Сообщений: 116

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')

?

Последний раз редактировалось armidoll, 25.06.2016 в 02:41.
Ответить с цитированием
  #3 (permalink)  
Старый 27.06.2016, 11:35
Кандидат Javascript-наук
Отправить личное сообщение для zlodiak Посмотреть профиль Найти все сообщения от zlodiak
 
Регистрация: 24.02.2012
Сообщений: 104

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

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

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

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


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


правильно?

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

Последний раз редактировалось zlodiak, 27.06.2016 в 12:09.
Ответить с цитированием
  #4 (permalink)  
Старый 27.06.2016, 14:09
Аватар для armidoll
Кандидат Javascript-наук
Отправить личное сообщение для armidoll Посмотреть профиль Найти все сообщения от armidoll
 
Регистрация: 28.05.2015
Сообщений: 116

Сообщение от zlodiak Посмотреть сообщение
я так понял, что для того чтобы пользоваться плагином, нужно обязательно 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 Посмотреть сообщение
но в этом случае получается, чт оя неправильно спроектировал программу вообще. потому что APP.DiariesView это не APP.DiaryView и прописывать модель модель только для того чтобы заработал плагин это не правильно и является костылём...
Да является костылём в данном учебном примере. Архитектуру лучше бы поменять.
Ответить с цитированием
Ответ


Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Форма отправки сообщения с сайта hardwolf Элементы интерфейса 20 24.10.2016 15:00
Не работает всплывающая форма на второстепенных страницах denjer Javascript под браузер 0 22.04.2016 21:30
откуда была отправлена форма ? avanesov89 Общие вопросы Javascript 3 16.04.2014 17:50
Не передается форма в выводе результатов через ajax tot18 AJAX и COMET 4 06.03.2014 16:15
JS загружает изображение всегда с локального кэша - почему? buhpro Общие вопросы Javascript 4 02.10.2013 21:01