Backbone:我的验证并没有阻止将空格设置为值

时间:2013-12-08 04:17:44

标签: javascript validation backbone.js backbone-views

我一直在关注Backbone的教程,并在此处设置了我的任务项目:

http://leongaban.com/_pro/

现在在我的单个任务视图中,我有一个验证错误,我需要found out here {validation:true}

它的作用是防止用户输入空值(即:删除当前值)但是我不能阻止用户只输入空格

我的模型和验证方法:

App.Models.Task = Backbone.Model.extend({
    validate: function(attrs) {

        var errors = this.errors = {};

        if (attrs.title != null) {

            console.log('title is not null');

            if ($.trim(attrs.title) == null) {
                alert('error');
                console.log('title is required');
            }
        }

        // if ( $.trim(!attrs.title) ) {
        //  return false;
        // }
    }
});

您可以在此处设置新值:

editTask: function() {
        var newTaskTitle = prompt(this.msgPrompt, this.model.get('title'));

        // check for null value
        if ( !newTaskTitle ) return;

        console.log(newTaskTitle);
        this.model.set('title', newTaskTitle, { validate : true });
    },

If you notice in my example您可以更改值并且它可以正常工作,或尝试删除并提交空值,验证将停止它,但是如果用户只添加空格,您将如何有效地不更改值?

enter image description here

2 个答案:

答案 0 :(得分:3)

来自fine manual

  

验证 model.validate(attributes, options)

     

[...]如果属性有效,请不要从验证返回任何内容;如果它们无效,则返回您选择的错误。它可以像要显示的字符串错误消息一样简单,也可以是以编程方式描述错误的完整错误对象。

问题中的validate永远不会返回任何内容,因此它永远不会捕获无效值。

并且$.trim适用于字符串,而不是布尔值,所以我不知道这是什么:

if ( $.trim(!attrs.title) ) {
  return false;
}

打算这样做。

如果您的validate看起来更像这样:

validate: function(attrs) {
    var errors = { };
    if('title' in attrs) {
        // Adjust this if you want to allow `null` values.
        if($.trim(attrs.title || '') === '') {
            errors.title = 'Missing title';
        }
    }
    return _(errors).isEmpty() ? undefined : errors;
}
那么也许你会得到更好的结果。

演示:http://jsfiddle.net/ambiguous/p9ah5/

一些注意事项:

  1. 我使用in operator查看attrs是否有'title'键,其中包含任何值。价值可以是nullfalse0'pancakes'或......我们不关心价值是什么,我们只关心它是否存在所以我们使用in来确切地说出我们的意思。
  2. 您似乎想要一个对象中的错误消息,所以我们填充一个对象并使用_.isEmpty看看我们是否放了它,然后我们就会知道应该返回什么。
  3. Backbone会将错误放在validationError中,因此不需要this.error内容。

答案 1 :(得分:0)

啊想出来了!

我想我只会使用验证方法进行更全面的测试,但要检查空格或空格,这就足够了任务视图

editTask: function() {
    var newTaskTitle = prompt(this.msgPrompt, this.model.get('title'));

    // check for null value
    if ( ! $.trim(newTaskTitle) ) return;

    console.log(newTaskTitle);
    this.model.set('title', newTaskTitle, { validate : true });
},