昨天,经过大量研究后,我发现如果我不想在我的主干模型上设置个别属性(并进行验证),那么我需要发送 {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/