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