Почему мой dojo.byId не работает в библиотеке скриптов? - PullRequest
0 голосов
/ 09 января 2010

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

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

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

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

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

Ответы [ 4 ]

1 голос
/ 05 марта 2011

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

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

0 голосов
/ 01 февраля 2012

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

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

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

0 голосов
/ 28 января 2012

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

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

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

0 голосов
/ 11 января 2010

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

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

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

...