2013-04-06 61 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