使用Backbone“set”将validate设置为默认值为true

时间:2013-06-29 20:31:29

标签: validation backbone.js

在我使用Backbone 1.0.0的代码中,我的模型的验证功能只在我去的时候被调用:

myThing.set( "title", "My title string", { validate : true } );

我的模型的initialize函数中是否有一种方法可以将默认值设置为true,以便:

myThing.set( "title", "My title string" );

会导致调用validate函数吗?

3 个答案:

答案 0 :(得分:2)

无法覆盖方法的默认行为,但您仍然可以直接覆盖set方法,例如:

var set = Backbone.Model.prototype.set;
Backbone.Model.prototype.set = function(key, val, options) {
  return set.call(this, key, val, _.extend({validate: true}, options));
}

请记住,set方法必须处理2种不同的情况(因为它允许传递对象作为参数)。所以这个例子不会一直有效。您可以参考实际的Backbone代码来查看它是如何完成的示例。

答案 1 :(得分:1)

@Loamhoof给出的答案非常不完整。这是一个完整的解决方案:

/**
 * @file
 * A Backbone Model subclass that enforces validation when calling set().
 */

(function (Backbone) {

"use strict";

Backbone.MyBaseModel = Backbone.Model.extend({

  /**
   * {@inheritdoc}
   */
  initialize: function (options) {
    this.__initialized = true;
    return Backbone.Model.prototype.initialize.call(this, options);
  },

  /**
   * {@inheritdoc}
   */
  set: function (key, val, options) {
    if (this.__initialized) {
      // Deal with both the "key", value and {key:value}-style arguments.
      if (typeof key === 'object') {
        key.validate = true;
      }
      else {
        if (!options) {
          options = {};
        }
        options.validate = true;
      }
    }
    return Backbone.Model.prototype.set.call(this, key, val, options);
  }

});

}(Backbone));

答案 2 :(得分:0)

我认为这会对您有所帮助!

 set: function (key, val, options) {
    if (!options) {
      options = {};
      options.validate = true;
    }
    return Backbone.Model.prototype.set.call(this, key, val, options);
  }