Я думаю, что это одна из небольших ошибок в документации. Я заставил их работать, добавив код
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 избавится от нее, вам придется добавить этот указатель в проверки модели другим способом.
Извините, если это вызвало замешательство у кого-либо.