Пытаюсь не давать людям закрывать задачи по определенным условиям. Всё хорошо до момента, пока не надо сделать это из esq.
Точнее, функция this.callParent(arguments) никак не работает из
esq.getEntity(Id, function(result) {
this.callParent(arguments);
}, this);Уже пробовал сделать var self = this и вызывать от self, пробовал сохранить arguments до esq. Ничего не помогает, задача не сохраняется.
esq надо делать обязательно, т.к. изменение в другом объекте, которое я проверяю, может сделать другой человек и мне нужно проверить это прямо перед сохранением.
Есть способ?
Нравится
Добрый день, нужно либо смотреть в сторону asyncValidate (пример есть в DocumentPageV2), либо переопределить Save.
save: function(config,flag) {
if (flag) {
this.callParent(arguments);
} else {
//Validation Block
Terrasoft.chain(
this.checkPhonesCount,
function (callback, scope) {
this.save(config||{}, true),
callback.call(scope || this);
},
this
);
}
},
/**
* Проверка количества телефонов
* */
checkPhonesCount: function (callback, scope) {
var leadId = this.get("Id");
var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
rootSchemaName: "UsrLeadPhone"
});
esq.addAggregationSchemaColumn("Id", Terrasoft.AggregationType.COUNT, "Count");
esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(
Terrasoft.ComparisonType.EQUAL, "UsrLead", leadId));
esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(
Terrasoft.ComparisonType.NOT_EQUAL, "UsrPhone", ""));
esq.filters.addItem(Terrasoft.createColumnIsNotNullFilter("UsrPhone"));
esq.getEntityCollection(function (response) {
if (response && response.success) {
var collection = response.collection;
if (collection && collection.getCount() > 0) {
var count = collection.getByIndex(0).get("Count");
if (count >= 1) {
callback.call(scope || this);
return;
}
}
var msg = this.get("Resources.Strings.PhonesErrorMessage");
msg = this.Ext.String.format(msg, 1);
Terrasoft.showInformation(msg);
}
}, this);
},
Я делаю так:
1) у кнопки сохранить bind меняю на другую функцию (пр. onBeforeSave)
2) в onBeforeSave реализую логику, а дальше вызываю/не вызываю save-метод
Также можно в save зашить проверку какого-либо параметра. Сохранять arguments, проверять параметр, если false-> вызывать свою функцию, в конце своей функции параметр = true и вызвать save с сохр. аргументами. Тоже в принципе вариант
Добрый день, нужно либо смотреть в сторону asyncValidate (пример есть в DocumentPageV2), либо переопределить Save.
save: function(config,flag) {
if (flag) {
this.callParent(arguments);
} else {
//Validation Block
Terrasoft.chain(
this.checkPhonesCount,
function (callback, scope) {
this.save(config||{}, true),
callback.call(scope || this);
},
this
);
}
},
/**
* Проверка количества телефонов
* */
checkPhonesCount: function (callback, scope) {
var leadId = this.get("Id");
var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
rootSchemaName: "UsrLeadPhone"
});
esq.addAggregationSchemaColumn("Id", Terrasoft.AggregationType.COUNT, "Count");
esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(
Terrasoft.ComparisonType.EQUAL, "UsrLead", leadId));
esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(
Terrasoft.ComparisonType.NOT_EQUAL, "UsrPhone", ""));
esq.filters.addItem(Terrasoft.createColumnIsNotNullFilter("UsrPhone"));
esq.getEntityCollection(function (response) {
if (response && response.success) {
var collection = response.collection;
if (collection && collection.getCount() > 0) {
var count = collection.getByIndex(0).get("Count");
if (count >= 1) {
callback.call(scope || this);
return;
}
}
var msg = this.get("Resources.Strings.PhonesErrorMessage");
msg = this.Ext.String.format(msg, 1);
Terrasoft.showInformation(msg);
}
}, this);
},
Еще можно создать валидатор, который будет делать все проверки и срабатывать перед сохранением записи, его например привязать к полю "состояние"
Вообще, лучше не делать такие проверки только лишь в клиентской логике. Чисто теоретически, пользователь сможет отловить выполнение функции и в отладчике перешагнуть проверку. Хорошо бы и на объекте в обработчике Saving проверять соблюдение условия.
1. Если не вчитываться в смысл задачи, а только подсказать как сделать желаемое то вот этот способ:
save: function() {
...
var args = arguments;
var parentMethod = this.getParentMethod();
....
esq.GetEntity(function() {
parentMethod.apply(this, args)
}, this);
}
2. По смыслу же задачи, вам нужно делать валидацию, а не переопределять методы сохранения. посмотрите примеры в коде с использованием методов addColumnValidator, validate, asyncValidate.
addColumnValidator, validate делают синхронные проверки. asyncValidate асинхронная валидация, используется когда нужно сделать например запрос в БД для проверки.