1

第一次尝试

试图让Backbone.Validation 插件工作。我已经声明了要验证的属性...

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
4

2 回答 2

1

假设您正确设置了 mixin:

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

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

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

s.isValid(true);

或者,例如:

s.isValid("location");
于 2013-04-08T19:55:30.223 回答
1

第三方库可能会破坏它。

我今天有完全相同的症状。Mixin 集,验证集,但 model.isValid(true) 始终返回 true。调试后,我发现 Backbone.Validation 使用下划线 _.without 函数(当它为您的模型获取验证规则时),它调用深层 Array.indexOf 中的某处,该函数被 Stylish Select 覆盖(http://github.com /sko77sun/Stylish-Select ) 导致没有函数返回总是空数组 []。这使得 Backbone.Validation 认为我的模型好像没有设置验证规则,这就是为什么我的模型的任何状态都验证为 true 的原因。

于 2013-09-18T08:08:07.470 回答