VoliJS / NestedTypes

BackboneJS compatibility layer for Type-R data framework.
https://volicon.github.io/Type-R/
MIT License
94 stars 17 forks source link

fix the no-validation bug #107

Closed gerasim closed 8 years ago

gaperton commented 9 years ago

Thanks, will look at this change later, and test it on our code base. This is very fragile and dangerous place to change, need to double check.

Btw, is there any bug description?

gerasim commented 9 years ago

Добрый день! Рискну написать по-русски, поскольку по-английски я изъясняюсь плохо (в основном читаю тех.доки), а Вы, судя по всему, говорите по-русски не хуже меня:) Если все-же желательно общаться на английском - скажите.

С проблемой столкнулся при вызове метода модели save. Если в модели заданы правила валидации, то  при использовании Вашей библиотеки они не срабатывают. Вернее, валидация вызывается, отрабатывает как положено, но при этом метод set, который переопределен в nestedTypes, не возвращает false (как должно быть в этом случае),  и процесс не прерывается.

Предлагаемые мной изменения решают проблему, хотя, конечно, лишний раз проверить не мешает. Я сейчас с backbone и с nestedTypes только знакомлюсь.

код для воспроизведения

var AuthForm = Nested.Model.extend({ defaults: { loginName: String.value(''), password : String.value('') },

        url : function(){
            return 'google.com';
        },

        initialize: function(){
            this.on("invalid", function(model, error){
                console.log(error);
            });
        },

        validate: function(attrs, options) {
            if (attrs.loginName == '') {
                return "loginName cannot be empty";
            }
            if (attrs.password == '') {
                return "password cannot be empty";
            }
        }
    }

);

var af = new AuthForm;

af.save({ loginName: 'ff', password: '' },{ success : function(model, response, options){ console.log('success success success'); }, error : function(model, response, options){ console.log('Error Error Error'); } });

С уважением, Вадим

Понедельник, 26 октября 2015, 11:35 -07:00 от Vlad Balin notifications@github.com:

Thanks, will look at this change later, and test it on our code base. This is very fragile and dangerous place to change, need to double check. Btw, is there any bug description? — Reply to this email directly or view it on GitHub .

gaperton commented 9 years ago

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

Спасибо за исправление. Поверю, не отъедет ли крыша у нашего продукта (бывает), и внесу изменение.

gaperton commented 8 years ago

Since approach to validation is completely changed in 1.3 (more advanced technique, and no longer compatible with backbone), this pull request are no longer valid.

In 1.3, validation is attribute-level and declarative, and no longer happens in model.set or dependent on set. model.save makes direct validation calls.

In order to check whenever model is valid, one should check model.validationError property for not being null or call model.isValid(). set ignores validate option - validation behaves as if it happens always, but evaluated lazily on first access. Not set, nor save does not reject changes if they lead to invalid model. set does not throw invalid event. There will be an article explaining new approach to validation.

gaperton commented 8 years ago

Yes, I have to explain why I didn't merge it before. After detailed look It appeared that in previous nestedtypes versions backbone's validation was completely broken, it wasn't just matter of set return value.

New mechanics is designed to play well with React.