2013-03-29 68 views
1

以下代碼有什麼問題?Backbone.js模型驗證不起作用

(function(){ 

    window.App = { 
     Models: {}, 
     Collections: {}, 
     Views: {} 
    }; 

    window.template = function(id) { 
     return _.template($('#' + id).html()); 
    }; 

    App.Models.Task = Backbone.Model.extend({ 
     defaults:{ 
      title: '', 
      priority: 0 
     }, 

     validate: function(attrs, options){ 
      if (attrs.priority < 0){ 
       return 'Priority cannot be negative.'; 
      } 
     } 
    }); 

    var task = new App.Models.Task ({ title: 'Sample Task', priority: 5 }); 
    task.on('invalid', function(model, error) { console.log(error); }) 

    task.save({ priority: -9 }); // Should not pass validation 
    console.log(task.validationError); // Prints a validation error 

    console.log(task.toJSON()); // Model is updated with -9 
    console.log(task.isValid()); // false 
})(); 

輸出:

Priority cannot be negative. app.js:27 
Priority cannot be negative. app.js:30 
Object {title: "Sample Task", priority: -9} app.js:32 
Priority cannot be negative. app.js:27 
false 

我現在看的視頻教程,它是基於舊的版本,其中確認被默認在set方法Backbone.js的強制執行的。但在當前版本中,默認情況下,在save方法上執行驗證。

但即使它不是一個有效的值,並且驗證不通過,爲什麼它仍然將值設置爲-9。當驗證不通過時它不應該設置值嗎?

+0

你究竟在期待什麼?你設置了一個負面的優先級,所以你不通過驗證,所以..? (順便說一句,不是輸出中的第4行?我覺得它不應該在這裏) – Loamhoof

+0

是不是不應該將值設置爲-9,因爲驗證不通過? – Zuhaib

回答

3

在新版本中,保存新的數據時,你需要通過驗證選項:

task.save({ priority: -9 }, {validation: true}); 
+1

我很想知道你在哪裏找到的。*模型驗證現在只在模型#保存中被默認強制執行,並且在構造或模型#集合中不再強制執行,除非{validate:true}選項通過。* Backbone 0.9.10 – Loamhoof

+0

噢,它1.0' s代碼:* options = _.extend({validate:true},options); * Model#save。 – Loamhoof

+0

當我在做一些Backbone的工作之前,我遇到了同樣的情況.. http://stackoverflow.com/questions/14426155/backbone-validate-does-not-work ..我的來源圍繞這些類型的答案 – ashley

0

好吧,你只需要簡單地設置標誌「等待」爲真或設置「驗證」標誌爲真。怎麼樣?那麼,如果您沒有將等待標誌設置爲true,那麼將在驗證之前使用您通過save方法的選項調用set方法。因此,因爲您不需要傳遞驗證標誌,所以set方法不會接收它,請不要運行驗證並設置屬性。
由於文檔不清楚等待標誌:您的服務器仍然會收到更新的數據。

1

這是官方網站代碼存在的問題。看看save函數的來源,我知道在調用set後會發生options.validatetrue的預設。

你可以嘗試切換行的順序(在Modelsave功能):

if (attrs && (!options || !options.wait) && !this.set(attrs, options)) return false; 

    options = _.extend({validate: true}, options); 

到:

options = _.extend({validate: true}, options); 

    if (attrs && (!options || !options.wait) && !this.set(attrs, options)) return false; 

,但我不知道它會不會導致其他問題。

或者您可以使用GitHub repo中的代碼 - 有一個解決此問題的更改。

在Backbone.js的當前版本
6

默認情況下驗證之前保存調用,但也可以被稱爲如果{驗證:真}之前設置被傳遞。

所以,爲了能有這個方法叫上你的方法,你應該像這樣在你的模型設置屬性時設置驗證爲真:

yourmodel.set('someproperty', 14, {validate: true}); 

我希望我的回答對您有所幫助。