2013-03-19 62 views
1

我在第一次看到backbone.js。我目前正在查看模型驗證,但是我直接從教學文本中獲取的這個測試腳本沒有按預期觸發錯誤事件。Backbone.js新手 - 無法獲取模型錯誤事件觸發

Person = Backbone.Model.extend({ 
    // If you return a string from the validate function, 
    // Backbone will throw an error 
    validate: function(attributes) { 
     if (attributes.age < 0 && attributes.name != "Dr Manhatten") { 
      return "You can't be negative years old"; 
     } 
    }, 
    initialize: function() { 
     alert("Welcome to this world"); 
     this.bind("error", function(model, error) { 
      // We have received an error, log it, alert it or forget it :) 
      alert(error); 
     }); 
    } 
}); 

var person = new Person; 
person.set({ name: "Mary Poppins", age: -1 }); 
// Will trigger an alert outputting the error 

var person = new Person; 
person.set({ name: "Dr Manhatten", age: -1 }); 
// God have mercy on our souls 

我來測試這個頁面是死的簡單如下:

<html> 
<body> 
    <script type="text/javascript" src="Scripts/jquery-1.9.1.min.js"></script> 
    <script type="text/javascript" src="Scripts/underscore-min.js"></script> 
    <script type="text/javascript" src="Scripts/backbone-min.js"></script> 
    <script type="text/javascript" src="Scripts/test4.js"></script> 
</body> 
</html> 

所有我看到的是兩個「歡迎來到這個世界」的警報。有任何想法嗎?

回答

3

您的源代碼可能是基於老版本的Backbone,Model.validate隨着時間的推移發生了很大變化。

changelog

0.9.10:模型驗證現在是默認的型號纔會強制執行保存,默認情況下 在建或在型號組不再執行,除非{validate:true}選項傳遞。

驗證model.validate(屬性選項)
這種方法是未定義,並鼓勵你與你定製 驗證邏輯來​​覆蓋它,如果你有任何可以在JavaScript中執行的東西。 默認情況下在保存之前調用驗證,但如果{validate:true}已通過,則在設置之前也可以調用 。 [...] 失敗的驗證觸發「無效」事件

所以:

  • 設置屬性時,以驗證模型,使用validate:true選項
  • 綁定到invalid事件
  • 和使用Events.on代替過時綁定的

您的代碼可能看起來像這樣

Person = Backbone.Model.extend({ 
    // If you return a string from the validate function, 
    // Backbone will throw an error 
    validate: function(attributes) { 
     if (attributes.age < 0 && attributes.name != "Dr Manhatten") { 
      return "You can't be negative years old"; 
     } 
    }, 
    initialize: function() { 
     console.log("Welcome to this world"); 
     this.on("invalid", function(model, error) { 
      // We have received an error, log it, alert it or forget it :) 
      console.log(error); 
     }); 
    } 
}); 

var person = new Person; 
person.set({ name: "Mary Poppins", age: -1 }, {validate:true}); 
// Will trigger an alert outputting the error 

var person = new Person; 
person.set({ name: "Dr Manhatten", age: -1 }, {validate:true}); 

並有小提琴http://jsfiddle.net/nikoshr/udm8A/(一定要打開控制檯,我轉換alert調用console.log

+1

謝謝,看起來像我支付了$ 3一嚴重脫離過期教程!非常感激。 – getsetcode 2013-03-19 14:14:56

+1

@tomtroughton公平地說,0.9.10只有2個月的時間:) – nikoshr 2013-03-19 14:16:26