Extendscript: динамически создавать выпадающие списки и функции onChange для них.

Вот сложный. Я относительно новичок в написании сценариев, но у меня есть идея, с которой я хочу работать.

У меня есть скрипт, который динамически генерирует раскрывающиеся списки на основе массива: каждый элемент в этом массиве создает dropdownlist.

function getDropDownLists(inputArray, grp) { //input an array and the UI Group we're adding these DDLs to
          try {
            eval(grp + "Array = [];"); //Creates an array to store the DDLs we're about to create
            var listName; //Create variable to store name of DDL we're creating as we iterate through inputArray
            for (var i = 0; i < inputArray.length; i++) {
              listName = grp + "SrcLevel_" + i.toString(); //Get the name for the DDL we're about to create
              eval('var ' + listName + ' = ' + grp + '.add("dropdownlist",[0,0,150,25])'); //add a DDL for the current array item
              eval(listName + '.add("item","' + listName + '")'); //This line creates an item in each dropdown to tell me its name
              eval(grp + "Array[" + i + "] = " + listName + ";"); //Adds newly created DDL to the storage array
            }
          } catch (e) {
            alert("Error on line " + e.line + ":\n" + e.message);
          }
        }

Когда я вызываю эту функцию (здесь она может работать не идеально, так как я немного подчистил ее для отображения), она правильно создает все мои файлы dropdownlists. Однако я хочу создать onChange события для каждого из них, чтобы ссылаться на предыдущее в созданном массиве хранения и изменять его содержимое. Я знаю, как заставить работать события onChange, если бы они были известны dropdownlists, но каждый проект, над которым я буду работать, отличается, и я хотел бы, чтобы это работало без необходимости переоснащения каждый раз, когда требования проекта меняются.

Например, когда я вызываю getDropDownLists(['mom','dad','baby'],family), я получаю три dropdownlists: familySrcLevel_0,familySrcLevel_1,familySrcLevel_2. Как мне тогда создать onClick событий для каждого из этих dropdownlists, зная, что я не всегда буду знать, сколько их? Возможно ли такое? Это должно быть сделано в расширенном скрипте.


person Joshua Badger    schedule 17.06.2016    source источник
comment
Я должен добавить, что мне понадобится familySrcLevel_1, чтобы сослаться на выбор familySrcLevel_0 вверх по списку.   -  person Joshua Badger    schedule 18.06.2016
comment
Звучит сложно. Не могли бы вы разбить свою проблему на более мелкие части? Кроме того, ваш пример кода не показывает ничего, что вы пробовали с функциями onChange. Наконец, я бы посоветовал избавиться от блока try catch, а также блок eval усложняет отладку кода.   -  person fabianmoronzirfas    schedule 19.06.2016
comment
Зачем избавляться от блока try catch? Разве это не цель отладки? Я должен оставить операторы eval; именно они позволяют мне создавать dropdownlists на лету с уникальными именами переменных, чтобы я мог ссылаться на них раньше.   -  person Joshua Badger    schedule 21.06.2016
comment
Ну, если вы так думаете. Я всегда находил использование try catch грязным. Вы можете использовать некоторые строки ресурсов (руководство по Adobe JS Tools, стр. 79 ссылка), чтобы сгенерировать пользовательский интерфейс без использования eval. Но я думаю, что вы не можете создавать с ними функции.   -  person fabianmoronzirfas    schedule 21.06.2016
comment
Если бы я знал, каким всегда будет пользовательский интерфейс, мне не нужно было бы использовать eval. Но поскольку в зависимости от разных проектов входной массив может меняться, я не всегда знаю, сколько dropdownlists мне понадобится. Поэтому я динамически создаю пользовательский интерфейс на основе этого массива, поэтому мне не нужно переписывать сценарий каждый раз, когда он меняется. Это позволяет мне ссылаться на эти dropdownlists, давая им также уникальные сгенерированные имена, поэтому дети dropdownlists могут изменять свое содержимое на основе родительского dropdownlists.   -  person Joshua Badger    schedule 22.06.2016
comment
Я думаю, что это причина, по которой существуют строки ресурсов. Вы можете создавать их динамически, не используя строковый код js. Но эй. Если это работает для вас. ;) У меня всегда в голове звучит этот тихий голосок, называющий термин eval eeeeeeevvviiill, когда я дохожу до l eval   -  person fabianmoronzirfas    schedule 22.06.2016
comment
Что такого плохого в eval? это кажется проще, чем пытаться создать строку ресурса, когда мне все равно нужно создать onChange функции для dropdownlists, используя eval.   -  person Joshua Badger    schedule 22.06.2016
comment
Об eval: encrypted.google.com/search?hl=de&q=Eval %20is%20evil о создании функций на лету: stackoverflow.com/questions/20129236/ но вы правы, создание функции похоже на eval. Является ли динамическим только именование или вам нужно также динамическое поведение?   -  person fabianmoronzirfas    schedule 23.06.2016


Ответы (1)


Решение состояло в том, чтобы создать еще один оператор eval, содержащий функцию onChange, в конце функции выше.

person Joshua Badger    schedule 21.06.2016