Как добавить новую запись в интерактивную сетку с помощью методов IG, а затем установить значение столбца с помощью $ s () api? - PullRequest
0 голосов
/ 05 мая 2020

Я использую Oracle Apex 18.2.

У меня есть интерактивная сетка и настраиваемая кнопка для добавления новой строки в IG с помощью

apex.region("myRegionStaticId").widget().interactiveGrid('getActions').invoke('row-add-row');, а затем установите значение столбца, используя, $s("myColumnStaticId","2");. Когда я пробую, он добавляет первую строку без установки значений столбцов и начинает устанавливать значение со второй строки. Даже при использовании selection-add-row или insert-record всегда есть что-то с первой строкой. Вот образец,

[https://apex.oracle.com][1]
ws = ESLAM_WS
user = forhelp
pwd = forhelppwd
app = TEST
page = Add Row on top of an IG.

Ответы [ 2 ]

1 голос
/ 06 мая 2020

После долгих разговоров и тестов я обнаружил, что $s с setTimeout не очень надежен. Я снова настроил страницу 7 для демонстрации.

  1. Если вы дважды быстро нажмете кнопку Rowaddrow (второй раз перед возвратом первого setValue), вторая строка не будет инициализирована. Я покажу вам обходной путь для этого ниже, но вы
  2. Если вы уменьшите setTimeout, скажем, до 10 мс, и попытаетесь сфокусироваться в столбце Expiry Date перед нажатием кнопки Rowaddrow, вы обнаружу, что это не работает. Это означает, что, хотя сейчас работает setTimeout 100 мс, в будущем он может выйти из строя, если внутренний лог c IG изменится. Вряд ли, но кто знает.

На данный момент я бы сказал, что $s можно надежно использовать только для установки значения столбца в IG для активной строки. Когда действие row-add-row добавляет новую запись, оно делает ее активной, но это делается асинхронно через setTimeout. Это связано с тем, что IG основан на легковесном шаблоне и существует ряд эвристик asyn c (setTimeout), которые встроены для обработки событий фокуса и размытия, чтобы правильно включать и отключать строки и ячейки по мере необходимости *. 1017 *

Я считаю следующее наиболее надежным решением. К сожалению, это сложнее, чем то, что было у вас раньше, но это был единственный способ связать все вместе. Не стесняйтесь использовать это или нет. См. Пример на странице 8.

Щелкните правой кнопкой мыши пользовательскую кнопку Rowaddrow и выберите Create Dynami c Action . Установите Имя DA на rowAddRow, нажатие кнопки . Параметры Когда будут автоматически настроены для события щелчка на кнопке.

Выберите действие для нового DA. Установите Action на Execute JavaScript и введите следующий JavaScript в атрибут Code .

addRowClicked = true; // Global used to distinguish custom button click
this.triggeringElement.disabled = true; // Disable button to serialize access
apex.region("KITCHEN_SHARE_DTL").widget().interactiveGrid("getActions").invoke("row-add-row");

Создайте новый Dynami c Action и установите для Name значение New row initialized . В разделе Когда установите Событие на Инициализация строки [Интерактивная сетка] , Тип раздела на Регион и Регион * От 1055 * до KITCHEN_SHARE_DTL .

В разделе «Условие на стороне клиента» установите Тип на JavaScript выражение и введите следующий код в JavaScript Выражение (которое гарантирует, что DA срабатывает только при нажатии кнопки Rowaddrow):

addRowClicked === true

Выберите действие для нового DA. Установите Action на Set Value , Set Type на Stati c Assignment и Value на 2 . В Затронутых элементах установите Тип раздела на Столбцы и Столбцы на INGREDIENT_ID . Это заменит назначение stati c, которое выполнялось с помощью $s. Убедитесь, что Fire on Initialization отключен.

Щелкните правой кнопкой мыши ветку True для DA и выберите Create TRUE Action . Задайте Action значение Set Value , Set Type to SQL Statement и введите следующий код в SQL Заявление :

select MIN(EXPIRY_DATE) from stock
where ingredient_id = TO_NUMBER(:INGREDIENT_ID);

Установить Элементы для отправки в INGREDIENT_ID и отключить Специальные символы . В Затронутых элементах установите Тип выбора на Столбцы и Столбцы на EXPIRY_DATE . Убедитесь, что Fire on Initialization отключен.

Щелкните правой кнопкой мыши ветку True для DA и выберите Create TRUE Action . Установите Action на Execute JavaScript Code и введите следующий JavaScript в атрибут Code .

addRowClicked = false; // Unset the global
$x('ADD').disabled = false; // Enable the button
0 голосов
/ 05 мая 2020

Измените следующий код:

$s("INGREDIENT_ID","2");

на следующий:

setTimeout(function(){ $s("INGREDIENT_ID","2"); }, 100);

Кажется, что IG нужно немного времени для рендеринга новой строки, прежде чем вы сможете изменить любое значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...