【问题标题】:How can I do a single attribute set in Backbone.js (validation)如何在 Backbone.js 中设置单个属性(验证)
【发布时间】:2012-12-14 18:35:14
【问题描述】:

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

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

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,否则我需要在每个模型上都这样做。

有没有更好的方法来做到这一点?

【问题讨论】:

  • 您可以创建一个行为类似于 mixin 的对象,然后您可以使用它扩展每个模型。

标签: javascript validation backbone.js


【解决方案1】:

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"; }

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

【讨论】:

  • 啊,扩展的东西是新的吗?它以前没有那样的行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-09
  • 1970-01-01
  • 1970-01-01
  • 2011-07-24
  • 2021-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多