Работа с деталью на странице портала в режиме создания
Всем добрый день!
Друзья, подскажите, пожалуйста, кто-нибудь работал с деталью на странице портала самообслуживания?
Для бандла service сейчас пытаюсь реализовать деталь с редактируемым реестром, чтобы можно было указывать в заявке несколько значений из справочника. Всем известно, что, когда пытаешься добавить в деталь новое значение, то вызывается метод, который сохраняет родительскую запись, так как запись детали обязательно должна быть связана с родительской записью. Можно как-то добавить в деталь запись, не вызывая метод, который сохраняет родителя, но при этом, чтобы после сохранения родителя, в детали все корректно связалось? Как-то же это реализовано для файлов например.
Нравится
Как отключить логику сохранения раздела при добавлении на деталь, обсуждают тут, но для момента до первого сохранения так не подойдёт, данные нужно где-то хранить.
В средствах связи, схеме ContactCommunicationDetailV2 добавленные и удалённые складываются в две коллекции Collection и DeletedItems и при сохранении из них извлекаются и идут на сервер одним составным запросом:
deleteItem: function(item) { var deletedItems = this.get("DeletedItems"); var collection = this.get("Collection"); collection.removeByKey(item.get("Id")); deletedItems.addItem(item); }, addItem: function(tag) { if (this.get("IsDetailCollapsed")) { return; } var communicationTypes = this.get("CommunicationTypes"); var communicationType = communicationTypes.get(tag); var newItem = this.Ext.create("Terrasoft.BaseCommunicationViewModel", { entitySchema: this.entitySchema, columns: this.columns }); newItem.set("CommunicationTypes", communicationTypes); newItem.sandbox = this.sandbox; newItem.setDefaultValues(function() { newItem.set("CommunicationType", { value: communicationType.get("Id"), displayValue: communicationType.get("Name") }); newItem.set("Contact", { value: this.get("MasterRecordId") }); var itemKey = newItem.get("Id"); var collection = this.get("Collection"); collection.add(itemKey, newItem); this.changeCardPageButtonsVisibility(true); }, this); return newItem; }, ... getDeleteItemsQueries: function() { var deletedItems = this.get("DeletedItems"); var deleteQueries = []; deletedItems.each(function(item) { var primaryColumnValue = item.get(item.primaryColumnName); var deleteQuery = item.getDeleteQuery(); deleteQuery.enablePrimaryColumnFilter(primaryColumnValue); deleteQueries.push(deleteQuery); }, this); return deleteQueries; }, getSaveItemsQueries: function() { var collection = this.get("Collection"); var saveQueries = []; collection.each(function(item) { if (item.isChanged() && item.validate()) { saveQueries.push(item.getSaveQuery()); } }, this); return saveQueries; }, ... save: function() { var restrictionsQuery = this.getSaveRestrictionsQuery(); var queries = restrictionsQuery ? [restrictionsQuery] : []; var saveQueries = this.getSaveItemsQueries(); queries = queries.concat(saveQueries); var deleteQueries = this.getDeleteItemsQueries(); queries = queries.concat(deleteQueries); if (Ext.isEmpty(queries)) { this.publishSaveResponse({ success: true }); return true; } var batchQuery = Ext.create("Terrasoft.BatchQuery"); Terrasoft.each(queries, function(query) { batchQuery.add(query); }, this); batchQuery.execute(this.onSaved, this); return true; }, onSaved: function(response) { var message = response.ResponseStatus && response.ResponseStatus.Message; if (response.success && !message) { var deletedItems = this.get("DeletedItems"); var collection = this.get("Collection"); collection.each(function(item) { item.isNew = false; item.changedValues = null; }, this); deletedItems.clear(); this.publishSaveResponse(response); } else { this.publishSaveResponse({ success: false, message: this.getValidationMessage(message) }); } },