1

我正在尝试检查在实例化时传递给我的模型的值是否为空。如果是,则不应存储它们,也不应使用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 告诉我“到达”是未定义的。

我假设当我的验证方法失败时,@get 'reach' 将返回默认值。我错过了什么?

对我来说,这样做的合乎逻辑的方法是验证模型中的所有内容,而不是在我将其传递给模型之前。

我可能错了,所以我在这里要求更好地了解我如何在 Backbone 中正确验证,或者我是否只是在做一些根本错误的事情。

4

1 回答 1

1

我假设当我的验证方法失败时,@get 'reach' 将返回默认值。我错过了什么?

验证失败会中止set,使值保持原样。您缺少的是,当您在实例化期间进行验证时,任何属性的先前值都是undefined.

也许这有点违反直觉(并且可能是一个值得报告的问题),但在实例化期间,默认值和初始属性在一次调用中设置和验证,因此如果验证失败,即使默认值也没有设置。

查看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,而不是setting defaults then attributes

于 2013-06-07T15:44:46.610 回答