使用 Backbone stickit 进行 Backbone Validation - 更改属性时验证所有属性

Posted

技术标签:

【中文标题】使用 Backbone stickit 进行 Backbone Validation - 更改属性时验证所有属性【英文标题】:Backbone Validation with Backbone stickit - All attributes being validated when one is changed 【发布时间】:2014-02-07 21:23:56 【问题描述】:

我正在尝试将 Backbone Validation 与 Backbone Stickit 一起使用,我希望在用户输入属性时一次验证一个属性。但是,当用户输入一个值时,模型上的所有属性都会得到验证,而不仅仅是用户更改的属性。我做错了什么?

我的观点:

bindings:
        '#username' : 
           observe:'username',
           setOptions: 
                validate:true
           
        ,

        '#email' : 
           observe:'email',
           setOptions: 
                validate:true
           
        ,

        '#firstname' : 
           observe:'firstName',
           setOptions: 
                validate:true
           
        , 

.......

onShow: function()    
        Backbone.Validation.bind(this, 
              valid: function(view, attr) 
                alert('VALID - ' + attr);
              ,
              invalid: function(view, attr, error) 
                alert('INVALID - ' + attr);
              
            );

        this.stickit();

    ,

【问题讨论】:

偶然解决了这个问题?遇到同样的问题 对不起,我从来没有解决过这个问题。根据我的记忆,以及阅读 yousefcisco 的回复,这是由于主干模型的行为 【参考方案1】:

在模型(1) 中设置值时,将使用您通过setOptions 的所有内容。当您将 validate: true 传递给 Backbone 模型的 set 函数时,它将验证模型中的值以及传递给 set 函数 (2) 的值,这意味着每次设置新值时它都会验证整个模型导致你现在看到的问题。你没有做错任何事。

您可以通过将验证拆分为多个单独的函数并在属性更改时仅调用所需的函数,然后更改验证函数以调用所有这些单独的函数来验证整个模型来解决此问题。

【讨论】:

您能详细说明一下吗? 这里的主要问题是当 validate: true 被传递时,Backbone 将验证整个模型。一种解决方案是创建单独的验证函数(例如 validateCountry、validatePhone),然后设置事件侦听器以更改国家和电话以触发验证函数。然而,这个解决方案并不是很好,并且给您的应用程序增加了一大堆复杂性。这是该解决方案的外观的不完整要点(它太复杂而无法完成)gist.github.com/yousefcisco/5ba5d571eff103650c87【参考方案2】:

这也发生在我身上。就我而言,我将模型中的默认值设置为“”(空白)。删除它们并且它起作用了

【讨论】:

【参考方案3】:

尝试在您的视图绑定中对 backbone.stickit setOptions 对象使用 backbone.validation forceUpdate 参数。这对我有用,我遇到了类似的问题。

就像 yousefcisco 提到的那样,主干将在设置或保存时验证模型中的所有属性,具体取决于您传递的选项,但在我的情况下,我不需要单独验证每个属性,但属性没有得到即使只有一个属性无效也设置,然后我尝试了forceUpdate: true,它发挥了魔力。

在这里查看:http://thedersen.com/projects/backbone-validation/#configuration/force-update

【讨论】:

【参考方案4】:

为此,您应该从模型中删除默认值(至少对于您验证的属性)值

【讨论】:

你能解释更多吗?请阅读如何改进您的答案meta.***.com/q/253804/3664960 如果这确实是您的答案

以上是关于使用 Backbone stickit 进行 Backbone Validation - 更改属性时验证所有属性的主要内容,如果未能解决你的问题,请参考以下文章

使用 Backbone stickit 进行 Backbone Validation - 更改属性时验证所有属性

如何让backbone.stickit 一次收集所有值?

如何修复Backbone.stickit中的'this.stickit()不是函数'错误

在 Backbone Stickit 中结合使用 visible 和 onGet

模型未在表单提交时更新,使用 Backbone + Stickit

与 require.js 和 backbone.stickit 一起使用时出现奇怪的 Backbone.Validation 错误