2013-04-06 60 views
0

您好我是新来的backbonejs的一个bug,这是设置backbonejs功能

我也遇到过,而我是想的http://addyosmani.github.com/backbone-fundamentals/#validation

一个例子,我已经创建了模型的2物体,myTodo和问题myTodo1,

如果我叫设置这样的功能,它返回完成:虚假由于验证错误

 

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

+0

'myTodo1.set({validate:true})'将一个名为'validate'的属性设置为true。试试'myTodo1.set({validate:'hello!'}); console.log(myTodo1.get('validate'));'在你的代码中,你会发现这与运行你的validate函数无关。 – 2013-04-06 22:37:38

回答

1

它们完全不同。

myTodo1.set({validate:true}) 

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

无论如何,你不能希望事后做验证,因为你的属性已经被设置。

编辑:
一个新值,虽然设置到validate属性时,我不知道该行为。但是你肯定会用布尔值重写你的验证函数。这肯定会导致意想不到的行为。

编辑2:

好吧,我想这将是我最后一次尝试。

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

也等同于:

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

但不等同,在任何情况下,TO:

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

在整合了最新的{validate: true}告诉骨干应用验证功能在模型上。

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

+0

我也想知道如何回答您的回复,它不是在格式化 – 2013-04-06 13:42:24

+0

嗨@Loamhoof这一行来, 在backbonejs的代码
< - 语言:郎JS - > myTodo。 set('completed',true,{validate:true});
和这行代码做相同的工作,
: myTodo.set({完成:真},{验证:真})< - - 语言郎-JS!>; 我想知道如果我第二个对象两次调用set函数,为什么工作没有完成。 myTodo1.set({completed:true}); myTodo1.set({validate:true}) – 2013-04-06 13:43:27

+0

我同意你的观点,你在评论中写的两段代码是完全相同的。但是'myTodo1.set({completed:true}); myTodo1.set({validate:true})'完全不同于'myTodo.set({completed:true},{validate:true});'...在这里,您只需将completed属性设置为true,然后设置该验证属性设置为true ... – Loamhoof 2013-04-06 13:47:21