Backbone Validation with Backbone stickit — все атрибуты проверяются при изменении одного из них.

Я пытаюсь использовать Backbone Validation с Backbone Stickit, я хочу проверять один атрибут за раз, когда пользователь вводит их. Однако, когда пользователь вводит значение, проверяются все атрибуты модели, а не только тот, который пользователь изменил. Что я делаю неправильно?

Мой вид:

bindings:{
        '#username' : {
           observe:'username',
           setOptions: {
                validate:true
           }
        },

        '#email' : {
           observe:'email',
           setOptions: {
                validate:true
           }
        },

        '#firstname' : {
           observe:'firstName',
           setOptions: {
                validate:true
           }
        }, 

.......

onShow: function(){    
        Backbone.Validation.bind(this, {
              valid: function(view, attr) {
                alert('VALID - ' + attr);
              },
              invalid: function(view, attr, error) {
                alert('INVALID - ' + attr);
              }
            });

        this.stickit();

    },

person Francium123    schedule 07.02.2014    source источник
comment
Решил это случайно? Застрял с той же проблемой   -  person Bharath Bhandarkar    schedule 19.06.2014
comment
Извините, я так и не решил эту проблему. Насколько я помню и прочитав ответ yousefcisco, это связано с поведением модели магистрали.   -  person Francium123    schedule 19.06.2014


Ответы (4)


Все, что вы проходите через setOptions, используется при установке значения в модели (1). Когда вы передаете validate: true в функцию набора модели Backbone, она проверяет значения в модели, а также значения, переданные в функцию набора (2) означает, что он будет проверять всю модель каждый раз, когда вы устанавливаете новое значение, вызывающее проблему, которую вы видите сейчас. Вы не делаете ничего плохого.

Вероятно, вы могли бы решить эту проблему, разделив проверку на несколько отдельных функций и вызывая только необходимые при изменении атрибута, а затем изменив функцию проверки, чтобы вызывать все эти отдельные функции для проверки всей модели.

person yousefcisco    schedule 11.05.2014
comment
Не могли бы вы уточнить? - person Bharath Bhandarkar; 19.06.2014
comment
Основная проблема здесь заключается в том, что Backbone проверит всю модель при передаче validate: true. Одним из решений этого было бы создание отдельных функций проверки (например, validateCountry, validatePhone), а затем установка прослушивателей событий для изменения страны и телефона для запуска функции проверки. Тем не менее, это решение не самое лучшее и добавляет сложности вашему приложению. Вот неполное описание того, как могло бы выглядеть это решение (оно стало слишком сложным, чтобы закончить) /yousefcisco/5ba5d571eff103650c87 - person yousefcisco; 22.06.2014

Это случилось и со мной. В моем случае я устанавливал значения по умолчанию в модели как '' (пусто). Удалил их и заработало

person Bharath Bhandarkar    schedule 19.06.2014

Попробуйте использовать параметр backbone.validation forceUpdate для вашего объекта backbone.stickit setOptions в привязках вашего представления. Это сработало для меня, и у меня была похожая проблема.

Как упомянул yousefcisco, магистраль будет проверять все атрибуты в модели при установке или сохранении, в зависимости от переданных вами параметров, но в моем случае мне не нужно было проверять каждый атрибут отдельно, но атрибуты не были установлены, даже если только один атрибут был недействительным, затем я попробовал forceUpdate: true, и он сделал свое волшебство.

проверьте это здесь: http://thedersen.com/projects/backbone-validation/#configuration/force-update

person quarkmarino    schedule 21.08.2014

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

person erratbi    schedule 23.11.2015
comment
не могли бы вы объяснить больше? прочитайте, как улучшить свой ответ meta.stackoverflow.com/q/253804/3664960, если это действительно был ваш ответ - person davejal; 23.11.2015