【问题标题】:How to add a custom validation rule to a model in Sencha Touch如何在 Sencha Touch 中为模型添加自定义验证规则
【发布时间】:2011-09-14 09:30:18
【问题描述】:

Sencha 的这篇文章介绍了如何使用内置验证规则(存在、长度、格式、包含、排除),并提到添加自定义规则很容易,但从未解释过如何操作。我已经在谷歌上下搜索并阅读了 sencha 文档,但我找不到任何关于如何做到这一点的信息。有什么想法吗?

http://www.sencha.com/learn/using-validations-and-associations-in-sencha-touch

【问题讨论】:

    标签: javascript validation sencha-touch extjs


    【解决方案1】:

    我认为这是文档中的小错误之一。我通过添加一些代码让它们工作

    if (Ext.data) {
        Ext.data.validations.custom = function (config, value) {
            if (config && Ext.isFunction(config.fn)) {
                //this should be the model
                if (config.self) {
                    return config.fn.call(config.self, value);
                } else {
                    return config.fn(value);
                } 
            }
            else 
            {
                return false;
            }
        };
        Ext.data.validations.customMessage = "Error";
    }
    

    然后要向模型添加验证,请将对象添加到模型的验证数组,类型设置为“自定义”,例如

    { 
        type: 'custom', field: 'SomeField', message: "Your field is bad",
        fn: function (SomeFieldValueForThisInstance) {
           //Add some validation code.  The this pointer is set to the model object
           //so you can call this.get("SomeOtherFieldToCheck")
           //or any other instance method
    
           //if the field is good
           return true;
           //else
           return false;
        }
    }
    

    更新: @salgiza 是对的,为了正确设置“this”指针,我忘记了几个步骤。如果您查看 sencha touch 代码,您会看到在 Ext.data.Model 的构造函数的末尾,它会检查对象上是否定义了 init 函数,如果有,则调用它

            if (typeof this.init == 'function') {
                this.init();
    

    定义模型后,您可以向原型添加一个 init 函数。在函数中,遍历对象的验证并添加对 this 的引用。此步骤应在创建任何模型之前完成。

        YourModel.prototype.init = function () {
            var i, len;
            if (this.validations) {
                for (i = 0, len = this.validations.length; i < len; i++) {
                    this.validations[i].self = this;
                }
            }
        };
    

    然后在上面的自定义验证函数中,只要检查配置是否有一个self指针,如果有,用self调用它。我已将上面的代码编辑为使用 self。

    注意:我没有看到模型的 init 函数记录在案,所以如果 sencha 摆脱它,您必须以其他方式将 this 指针添加到模型的验证中。 p>

    抱歉,如果这引起了任何人的困惑。

    【讨论】:

    • 我不知道自从您发布答案后它是否发生了变化,但是在 Sencha 1.1.1 中,验证范围是验证对象,因此似乎没有任何方法可以获取其他值在模型中,除了正在验证的那个(this.get 什么都不做,因为“this”不是模型)。
    • 1) 你有太多的else 分支。 2)YourModel.prototype.init去哪儿了?这没有任何意义。
    • @SarahVessels 1. 你是对的。我错过了第二个 else 块的 } 。对于那个很抱歉。 2. YourModel.prototype.init 可以去任何地方,只要你在声明你的模型之后执行它。我使用 RequireJS 来管理我的依赖项,因此我包含了在包含我的模型后添加到原型中的模块。
    • @JasonFreitas 感谢您的澄清!让我对YourModel.prototype.init 感到失望的部分是“这一步应该在创建任何模型之前完成。”
    【解决方案2】:

    我认为向模型添加复杂自定义验证的最简单方法是覆盖 validate 方法。见下文,由于父调用,它支持内置的验证类型。

    validate: function() {
        var me = this;
        var errors = this.callParent(arguments);
    
        /* custom complex validations here */
        if(true !== me.get('checkOne') &&
           true !== me.get('checkTwo') &&
           true !== me.get('checkThree')) {
           errors.add(Ext.create('Ext.data.Error', {
                        field  : 'checkOne',
                        message: 'Choose at least one check, e.g. checkOne'
                    }));
        }
    
        return errors;
    }
    

    【讨论】:

      【解决方案3】:

      我稍微修改了 Jason 的代码,用于 sencha touch 2(因为验证现在位于模型的配置属性中)。我建议创建一个基类,所有其他模型类都将从中继承。然后,一旦你这样做了,你就可以使用 jason 的技术在 Ext.data.validations 单例中添加自定义验证。

      Ext.define('MyApp.model.CustomModelBase', {
          extend: 'Ext.data.Model',
      
          //adding an initializer to let custom validators access "self"
          init : function () {
              var i, len;
              if (this.config.validations) {
                  for (i = 0, len = this.config.validations.length; i < len; i++) {
                      this.config.validations[i].self = this;
                  }
              }
          }
      });
      

      【讨论】:

        【解决方案4】:

        还需要实现自定义验证,谷歌搜索,也在 github 上找到了这个tomalex0/SenchaTouch-Form-Validation

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-11
          • 2015-09-05
          • 2017-12-01
          • 2014-01-14
          相关资源
          最近更新 更多