【问题标题】:Backbone Validation Plugin always validating to true骨干验证插件始终验证为真
【发布时间】:2013-04-08 18:28:04
【问题描述】:

第一次尝试

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

【问题讨论】:

    标签: validation backbone.js


    【解决方案1】:

    假设您正确设置了 mixin:

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

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

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

    s.isValid(true);
    

    或者,例如:

    s.isValid("location");
    

    【讨论】:

      【解决方案2】:

      第三方库可能会破坏它。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-13
        • 2019-07-12
        • 1970-01-01
        • 2016-01-20
        • 1970-01-01
        • 1970-01-01
        • 2011-05-01
        相关资源
        最近更新 更多