这是backbonejs设置功能的错误

时间:2013-04-06 12:46:48

标签: javascript backbone.js

您好我是backbonejs的新手,

我在尝试http://addyosmani.github.com/backbone-fundamentals/#validation

的示例时遇到了问题

我创建了一个2对象的模型,myTodo和myTodo1,

如果我这样调用set函数,则由于验证错误而返回completed:false


    var myTodo  = new Todo();
    myTodo.set('completed', true, {validate: true}); 
    console.log("completed: "+myTodo.get('completed'));
    /*
    The above code returns following log:
    This model has been initialized.
    Remember to set a title for your todo.
    completed: false
    */

购买执行以下代码时未执行验证的原因


    var myTodo1  = new Todo();
    myTodo1.set('completed',true);
    console.log("completed: "+myTodo1.get('completed'));
    myTodo1.set({validate:true})
    console.log("completed: "+myTodo1.get('completed'));
    /*
    The above code returns following log:
    This model has been initialized. underscore-test2.js:11
    completed: true underscore-test2.js:28
    completed: true 
    */

虽然两组代码执行相同的工作,但在第一种情况下验证执行但不在第二种情况下执行

为什么?????

下面的

是完整的示例代码。


    var Todo = Backbone.Model.extend({
      defaults: {
        completed: false,
      },
      validate: function(attribs){
        if(attribs.title === undefined){
            return "Remember to set a title for your todo.";
        }
      },
      initialize: function(){
        console.log('This model has been initialized.');
        this.on("invalid", function(model, error){
            console.log(error);
        });
        this.on('change:title', function(){
            console.log('- Values for title have changed.');
        });
      }
    });

    **var myTodo  = new Todo();
    myTodo.set('completed', true, {validate: true}); 
    console.log("completed: "+myTodo.get('completed'));**

    **var myTodo1  = new Todo();
    myTodo1.set('completed',true);
    console.log("completed: "+myTodo1.get('completed'));
    myTodo1.set({validate:true})
    console.log("completed: "+myTodo1.get('completed'));**

1 个答案:

答案 0 :(得分:1)

他们完全不同。

myTodo1.set({validate:true})

这里您没有运行验证。您只需将模型的属性“validate”设置为true即可。基本上,在第二个示例中,您将设置2个属性而不进行验证。

在任何情况下,您都不能希望之后进行验证,因为您的属性已经设置好了。

修改
但是,我不知道在为validate属性设置新值时的行为。但是你肯定用布尔值覆盖你的验证函数。这肯定会导致意想不到的行为。

编辑2:

好的,我猜这将是我的最后一次尝试。

myTodo1.set({completed:true});
myTodo1.set({validate:true});

也相当于:

myTodo1.set({completed: true}).set({validate: true});

但不等同于任何情况下:

myTodo1.set({completed: true}, {validate: true});

在lattest中,{validate: true}告诉Backbone在模型上应用验证功能。

在前者中,您只将已完成属性设置为true ,而不告知模型验证然后您再次将验证属性设置为true ,而不告诉模型验证。所以基本上你永远不会告诉模型验证