2013-04-08 84 views
1

第一次嘗試

試圖讓Backbone.Validation plugin正常工作。我宣佈我要驗證的屬性...骨幹驗證插件始終驗證爲真

class window.Models.SearchQuery extends Backbone.Model 

    defaults: 
     city: '' 
     keywords: '' 
     lat: '' 
     long: '' 
     location: '' 
     performed_at: '' 
     region: '' 


    validation: 
     keywords: 
      required: true 
      pattern: 'number' 
     location: 
      required: true 
      pattern: 'number' 

(我已經設置位置爲數字只是用於測試) 然後在Chrome瀏覽器開發工具...

s = new Meg.Models.SearchQuery({validate:true}) 
    s.set({'location': ''}) 
    s.isValid() 
    // true 

它總是通過驗證..


第二次嘗試

在驗證混合成模型,WI其他一切都一樣(如上)。

class App.Routers.AppRouter extends Backbone.Router 

    initialize: -> 
     _.extend(Backbone.Model.prototype, Backbone.Validation.mixin) 



s = new App.Models.SearchQuery({validate:true}) 
//returns object.. 
m.set({'location': 'ewf3ef3ref3rf'}) 
//returns object with changed attrs 
m.isValid('location') 
//TypeError: Cannot call method 'call' of undefined 

回答

1

假設你設置的混入正常:

_.extend(Backbone.Model.prototype, Backbone.Validation.mixin) 

使用Backbone.Validation,你需要通過true明確迫使整個模型的驗證。 (是的,它與Backbone的內置功能不一致)。

正如你可以從the code看到的那樣,isValid方法返回緩存驗證狀態,如果沒有明確告訴它來驗證所有屬性或數組或單個屬性。

s.isValid(true); 

,或者例如:

s.isValid("location"); 
1

第三方的lib可以把它弄壞了。

今天我的確有同樣的症狀。 Mixin集合,驗證集合,但model.isValid(true)始終返回true。調試後,我發現Backbone.Validation使用下劃線_.without函數(當它獲取模型的驗證規則時),該函數調用深層Array.indexOf中的某個地方,該地方被Stylish Select(http://github.com/sko77sun/Stylish-Select)覆蓋,沒有函數總是返回空數組[]。這使Backbone.Validation考慮我的模型,就好像它沒有驗證規則設置那就是爲什麼我的模型的任何狀態驗證爲true。