Почему мой dojo.byId не работает в библиотеке скриптов?

У меня есть веб-страница с кодом dojo, включая функцию, переданную в dojo.addOnLoad со следующим кодом:

laborDetailHandler.RevenueTotalInput = dojo.byId('#{id:LaborRevenueTotal}');
if (!laborDetailHandler.RevenueTotalInput) {
 console.warn('RevenueTotalInput not found.')
}

Если этот код встроен, даже если он находится над полем ввода LaborRevenueTotal, он работает.

Если этот код перемещается в библиотеку сценариев, я получаю сообщение «RevenueTotalInput не найден». сообщение, которое говорит мне, что dojo.addOnLoad получает функцию и выполняет ее, но по какой-то причине функция не работает.

Я здесь совершенно запутался. У кого-нибудь есть идеи?


person John Smart    schedule 08.01.2010    source источник
comment
Обновление: я должен был упомянуть... поле ввода html: ‹input type=text id=view:_id1:LaborRevenueTotal name=view:_id1:LaborRevenueTotal value=$2,800.00 class=xspInputFieldEditBox›   -  person John Smart    schedule 09.01.2010
comment
Что именно вы подразумеваете под «переехал в библиотеку сценариев»? Есть ли код на стороне сервера, который заменяет выражение #{...}?   -  person peller    schedule 11.01.2010


Ответы (4)


Выражение '#{...}' не работает внутри SSJS-библиотек, только в исходниках XPage или Custom Control.

Обходной путь: используйте предложение #{} в любом другом месте (например, в текстовом поле) и ссылайтесь на него в сценарии на стороне клиента.

person Frantisek Kossuth    schedule 05.03.2011

Если вы помещаете код в свойство или событие на XPage, он передается как строка и проходит через оценщик. Если вы посмотрите на классы Java, созданные для ваших XPages, в представлении Package Explorer, вы поймете, что я имею в виду. Код представляет собой строку, которая затем передается функции Java, которая оценивает его при загрузке страницы или во время выполнения.

Я не думаю, что код в библиотеках скриптов проходит через оценщик, поэтому #{id:myField} не вычисляется. Существует также проблема контекста, из которого можно определить, какой myField на отображаемой HTML-странице это означает.

Есть два способа обойти это. Один из них — передать идентификатор в ваши функции SSJS/CSJS из ваших событий XPage. Другой вариант в CSJS — использовать dojo.query.

person Paul Stephen Withers    schedule 01.02.2012

Прошу прощения! Я думал, что это вопрос из додзё; вместо этого это был вопрос о Lotus Notes XPages! Я до сих пор не уверен, почему это происходит, но кто-то подтвердил, что проблема серьезнее чем мой сценарий и как его решить.

Мой обходной путь заключается в том, чтобы не находить эти элементы в библиотеке скриптов, а получить дескрипторы нужных мне элементов и передать их функции инициализации в библиотеке скриптов.

Peller большое спасибо за ответ. Извините, мой вопрос был плохим.

person John Smart    schedule 11.01.2010

Хотя библиотеки скриптов не компилируются в XPages; они также не запускаются встроенными.

Лучшей практикой в ​​XPages является использование подхода черного ящика в библиотеках скриптов. Используйте параметризацию для всех функций, определенных в библиотеках скриптов (действительно как на стороне сервера, так и на стороне клиента).

В качестве альтернативы в SSJS вы можете получить объекты компонентов с помощью getComponent и узнать их идентификаторы клиентов, однако это снижает возможность повторного использования библиотек сценариев. Это нормально, если вы используете их только для того, чтобы ваш код XSP оставался чистым; но обязательно используйте ловушки ошибок (try/catch), потому что отладка SSJS - головная боль.

person Serdar Basegmez    schedule 28.01.2012