对于在实例化时验证的Backbone模型感到困惑

时间:2013-06-07 14:16:22

标签: javascript validation backbone.js coffeescript instantiation

我正在尝试检查在实例化时传递给我的模型的值是否为空。如果是,则不应存储它们,也不应使用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中如何正确验证,或者我是否只是做了一些根本错误的事情。

1 个答案:

答案 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