javascript - 如何在 Backbone.js 中设置单个属性(验证)

标签 javascript validation backbone.js

昨天,经过大量研究后,我发现如果我不想在我的主干模型上设置个别属性(并进行验证),那么我需要发送 {silent: true}。话虽如此,我们还发现在 backbone.js 的下一个版本中 silent: true 实际上仍会运行验证。

这个问题是验证 block 设置从实际设置属性。因此,如果我们没有 silent:true 那么就没有必要使用接受单个属性的 set 方法。为了解决这个问题,我们的验证方法看起来像这样:

validate : function(attrs) {
    var errors = {};
    if (typeof attrs.first_name !== 'undefined' && !attrs.first_name) {
        errors.first_name = "First name can't be empty";
    }
    ...
    if (!_.isEmpty(errors)) {
        return errors;
    }
}

这会导致无法保存。所以我们决定写这样的东西:

if (_.isEmpty(attrs)) {
    attrs = this.attributes;
}

问题在于,如果您在保存时发送了属性,那么您需要将它们合并进去,我想这没问题,但是为了让一些简单的验证工作/或不运行,这是相当多的工作.此外,除非我覆盖 _validate,否则我需要在每个模型上都这样做。

有更好的方法吗?

最佳答案

默认情况下,Backbone 在此处使用旧属性扩展旧属性:https://github.com/documentcloud/backbone/blob/master/backbone.js#L574

因此,只有新属性才能破坏验证方法。

在这里,我认为你的问题是你将太多的验证与所有属性的存在联系在一起,而你没有同时设置它们。因此,您应该确保允许将其他属性设置为 undefined

例子:

// Check if name is set, ignore otherwise
if( attr.name && attr.name !== "Santa" ) { return "Can't be Santa"; }

另一种解决方案是为每个属性赋予一个有效的默认值。

关于javascript - 如何在 Backbone.js 中设置单个属性(验证),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13884411/

相关文章:

forms - 未显示隐藏字段的 symfony 表单验证消息

backbone.js - 如何更改页面url

javascript - ASP.NET MVC JsonResult 日期格式

ruby-on-rails - Ruby on Rails 创建方法失败时,渲染会丢失局部变量

javascript - 我如何检查这些双重正则表达式

javascript - 如何将 HTML5 Canvas 模型与 MVVM/MVP 数据框架链接起来

Javascript MVC,需要结构/方法方面的帮助吗?

javascript - 使用 validate.js 验证我的 TextInput 结果未定义

javascript - 单击浏览器的后退按钮后,body onload 在 Firefox 中不起作用?

javascript - onblur 将文本复制到其他输入字段