После долгих разговоров и тестов я обнаружил, что $s
с setTimeout
не очень надежен. Я снова настроил страницу 7 для демонстрации.
- Если вы дважды быстро нажмете кнопку Rowaddrow (второй раз перед возвратом первого
setValue
), вторая строка не будет инициализирована. Я покажу вам обходной путь для этого ниже, но вы - Если вы уменьшите
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