Backbone Validation Plugin总是验证为true

时间:2013-04-08 18:28:05

标签: validation backbone.js

首先尝试

尝试让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

它总是通过验证..


第二次尝试

将验证混合到模型中,其他所有内容都相同(如上所述)。

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

2 个答案:

答案 0 :(得分:1)

假设您正确设置了mixin:

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

使用Backbone.Validation时,您需要明确传递true以强制验证整个模型。 (是的,它与Backbone的内置功能不一致)。

the code可以看出,isValid方法返回缓存的验证状态,如果没有明确告知验证所有属性或数组或单个属性。

s.isValid(true);

或者,例如:

s.isValid("location");

答案 1 :(得分:1)

第三方lib可能会破坏它。

我今天有同样的症状。 Mixin set,验证集但model.isValid(true)返回true。调试后我发现Backbone.Validation使用下划线_.without函数(当它获得模型的验证规则时),它调用深度Array.indexOf中的某个地方,被Stylish Select(http://github.com/sko77sun/Stylish-Select)覆盖没有函数返回的方法总是返回空数组[]。这使得Backbone.Validation将我的模型视为没有设置验证规则,这就是为什么我的模型的任何状态验证为真。