我正在尝试检查在实例化时传递给我的模型的值是否为空。如果是,则不应存储它们,也不应使用model.get('value')
模型实例化:
# Model
@latLongPicker = new Vamos.Models.LatLongPicker({
latitude : $('.latlongpicker .data input[name="campaign[latitude]"]').val(),
longitude : $('.latlongpicker .data input[name="campaign[longitude]"]').val(),
reach : $('.latlongpicker .data input[name="campaign[reach]"]').val()
}, { validate : true })
我的模特:
class Vamos.Models.LatLongPicker extends Backbone.Model
defaults :
reach : 5000
reachMin : 1000
reachMax : 10000
lattitude : 52.528239
longitude : 13.415677
initialize : ->
_.bindAll @
console.log @toJSON()
console.log @defaults
console.log @get 'reach'
validate : (attrs) ->
if attrs.reach == '' || attrs.reach == 0
return 'Reach cannot be zero or empty'
''
我可以看到我的模型已经过验证,但是我的console.log告诉我'reach'未定义。
我认为当我的验证方法失败时,@ get'advance'将返回默认值。我错过了什么?
对我而言,这样做的合理方法是验证模型中的所有内容,而不是在我将其传递给模型之前。
我可能错了所以我在这里要求更好地理解我在Backbone中如何正确验证,或者我是否只是做了一些根本错误的事情。
答案 0 :(得分:1)
我认为当我的验证方法失败时,@ get'advance'将返回默认值。我错过了什么?
验证失败会中止set
,保留原样值。您缺少的是,在实例化期间验证时,任何属性的先前值为undefined
。
也许这有点反直觉(并且可能是值得报告的问题),但在实例化期间,默认值和初始属性在一次调用中设置和验证,因此如果验证失败,即使未设置默认值。 / p>
查看Backbone.Model
构造函数:
var Model = Backbone.Model = function(attributes, options) {
var defaults;
var attrs = attributes || {};
options || (options = {});
this.cid = _.uniqueId('c');
this.attributes = {};
_.extend(this, _.pick(options, modelOptions));
if (options.parse) attrs = this.parse(attrs, options) || {};
if (defaults = _.result(this, 'defaults')) {
attrs = _.defaults({}, attrs, defaults);
}
this.set(attrs, options);
this.changed = {};
this.initialize.apply(this, arguments);
};
defaults
与传入的attributes
混合在一起,生成的对象(attrs
)传递给set
,而不是set
ting defaults
然后 attributes
。