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' はデフォルト値を返すと思います。私は何が欠けていますか?

私にとって論理的な方法は、モデルに渡す前ではなく、モデル内のすべてを検証することです。

私は間違っているかもしれないので、バックボーンで適切に検証する方法をよりよく理解するためにここに質問しています。

4

1 に答える 1

1

私の検証メソッドが失敗すると、@get 'reach' はデフォルト値を返すと思います。私は何が欠けていますか?

検証に失敗すると、 は中止setされ、値はそのままになります。あなたが見逃しているのは、インスタンス化中に検証すると、属性の以前の値はundefined.

少し直感に反するかもしれませんが (そして報告する価値のある問題かもしれません)、インスタンス化中にデフォルトと初期属性が設定され、1 回の呼び出しで検証されるため、検証が失敗した場合でもデフォルトは設定されません。

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渡さsetdefaults ます attributes

于 2013-06-07T15:44:46.610 に答える