Как добавить пользовательское правило проверки в модель в Sencha Touch - PullRequest
10 голосов
/ 14 сентября 2011

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

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

Ответы [ 4 ]

8 голосов
/ 14 сентября 2011

Я думаю, что это одна из небольших ошибок в документации. Я заставил их работать, добавив код

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. Я отредактировал код выше, чтобы использовать self.

Примечание: Я не вижу документированной функции инициализации Модели, поэтому, если Sencha избавится от нее, вам придется добавить этот указатель в проверки модели другим способом.

Извините, если это вызвало замешательство у кого-либо.

3 голосов
/ 16 апреля 2014

я думаю, что самый простой способ добавить сложные пользовательские проверки в вашу модель - это переписать метод 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;
}
2 голосов
/ 14 февраля 2012

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

1 голос
/ 02 февраля 2012

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

...