Ответ 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 >
Извините, если это вызвало путаницу для кого-либо.