2

在我使用 Backbone 1.0.0 处理的代码中,我的模型的验证函数仅在我去时被调用:

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

有没有办法在我的模型的初始化函数中将默认值设置为 true,这样:

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

会导致调用验证函数吗?

4

3 回答 3

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 代码来查看它是如何完成的示例。

于 2013-06-29T21:00:22.237 回答
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));
于 2013-12-19T18:32:59.627 回答
0

我想这会对你有所帮助!

 set: function (key, val, options) {
    if (!options) {
      options = {};
      options.validate = true;
    }
    return Backbone.Model.prototype.set.call(this, key, val, options);
  }
于 2021-03-10T07:00:56.480 回答