【问题标题】:set validate to default to true with Backbone "set"使用 Backbone "set" 将 validate 设置为默认为 true
【发布时间】:2013-06-29 20:31:29
【问题描述】:

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

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

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

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

会导致调用验证函数吗?

【问题讨论】:

    标签: validation backbone.js


    【解决方案1】:

    无法覆盖方法的默认行为,但您仍然可以直接覆盖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 方法必须处理两种不同的情况(因为它也允许将对象作为参数传递)。所以这个例子不会一直有效。您可以参考实际的 Backbone 代码来查看它是如何完成的示例。

    【讨论】:

    • @muistooshort 是的,我不小心认为上下文会被保留,而 set 显然不是一个随机函数。
    【解决方案2】:

    @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));
    

    【讨论】:

    • 为了清楚起见:初始化处理也确保初始 set() 调用不会得到验证。如果你也想验证它,那么你可以去掉initialize() 方法和this.__initialized 检查。
    • 嗯,这是自愿的,不完整。至于你的答案,key.validate = true; 应该是val.validate = true。此外,options.validate = true; 将阻止用户覆盖您现在的默认行为(他不能跳过验证)。我一定遗漏了一些东西,但是您的 __initialized 属性的目的是什么?作为旁注,以这种方式覆盖 initialize 方法将删除额外的参数(你永远不知道),为什么不改用 Backbone.Model.prototype.initialize.apply(this, arguments); 呢?
    • 具有讽刺意味的是,我最初也有val.validate = true,但这显然是错误的。我想知道你为什么会犯同样的错误:) 确实,用户不能再跳过验证了。这是我的应用程序中故意的。 __initialized 变量的目的是在构建/初始化模型时跳过验证。 initialize() 的其他参数不是 Backbone API 的一部分,因此不受支持。
    • 而且我知道它是自愿不完整的,但我认为如果他们可以从更完整的答案开始对其他人有所帮助:)
    • 我同意所有这些,因为这只是您的理念。但我仍然不同意key.validate。如果您将对象作为第一个参数传递,则选项包含在第二个参数中,即val。在key 对象中将validate 设置为true 只会向模型添加不需要的属性,并且无法确保验证。我一定是错过了什么。
    【解决方案3】:

    我想这会对你有所帮助!

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-17
      • 2019-01-06
      • 2014-02-04
      • 1970-01-01
      • 1970-01-01
      • 2016-07-14
      • 2016-04-25
      • 1970-01-01
      相关资源
      最近更新 更多