1

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

这样做的问题是,从实际设置属性中设置的验证块。因此,如果我们没有silent:true,那么设置一个接受单个属性的方法就没有意义了。为了解决这个问题,我们的 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,否则我需要在每个模型上都这样做。

有一个更好的方法吗?

4

1 回答 1

3

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

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

于 2012-12-14T19:15:54.077 回答