Как добавить настраиваемое правило проверки модели в Sencha Touch

В этой статье Sencha рассказывается, как использовать встроенные правила проверки (наличие, длину, формат, включение, исключение) и упоминает, что добавление пользовательских правил легко, но не объясняет, как это сделать. Я googled высоко и низко и прочитал документы sencha, но я не могу найти ничего о том, как это сделать. Любые идеи?

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

Ответ 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";
}

Затем, чтобы добавить проверку в модель, добавьте объект в массив проверки модели с типом, установленным на "custom", например

{ 
    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, вы увидите, что в конце конструктора Ext.data.Model он проверяет, существует ли функция init, определенная на объекте, и если это так, вызывает его

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

После определения вашей модели вы можете добавить функцию init к прототипу. В функции повторите проверку для объекта и добавьте ссылку на это. Этот шаг должен быть выполнен до создания любой из моделей.

    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.

Примечание. Я не вижу документацию по функции init, поэтому, если sencha избавится от нее, вам придется добавить этот указатель к проверке модели другим способом. p >

Извините, если это вызвало путаницу для кого-либо.

Ответ 2

Я немного адаптировал код от Jason для sencha touch 2 (поскольку проверки теперь находятся в свойстве конфигурации модели). Я предлагаю создать базовый класс, из которого наследуются все ваши другие классы моделей. Затем, как только вы это сделаете, вы можете использовать технику Jason для добавления пользовательских проверок в Ext.data.validations singleton.

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

Ответ 3

Я думаю, что самый простой способ добавить сложные пользовательские проверки в вашу модель - это перезаписать метод проверки. см. ниже, из-за родительского вызова, он поддерживает встроенные типы проверки.

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;
}

Ответ 4

необходимый для реализации пользовательской проверки, googled, также нашел это tomalex0/SenchaTouch-Form-Validation в github