Богатая JavaScript-функция findComponent - PullRequest
0 голосов
/ 19 августа 2011

Я пытаюсь добавить динамическое событие onclick, используя rich:findComponent как:

<font class="topFirstTablehdCategory2" style="font-size: 12px; cursor: pointer;" onclick="#{rich:findComponent('benchmarkEndDate').value = channelPerformanceController.resetDate}">
    RESET
</font>

Но я получаю

com.sun.el.parser.ParseException: Encountered "=" at line 1, column 48.

Что я хочу сделать, это установитьстроковое значение для rich:calender, чей идентификатор benchmarkEndDate предоставляется из поля resetDate класса ChannelPerformanceController.

Я также пишу метод javascript на странице jsp:

function setResetDate(id, date) {
    #{rich:findComponent('benchmarkEndDate').value} = date;
}

не работает.Он называется: onclick="setResetDate('benchmarkEndDate', '#{channelPerformanceController.resetDate}')"

Рендеринг в браузере:

function setResetDate(id, date) {
        2011-03-24 00:00:00.0 = date;
}

Этот метод:

function setResetDate(id, date) {
        document.getElementById(#{rich:clientId(id)}) = date;
}

изменяется на:

function setResetDate(id, date) {
        document.getElementById() = date;
}

Что я делаю не так?Как мне этого добиться?

1 Ответ

2 голосов
/ 19 августа 2011
  • JavaScript выполняется клиентом.
  • Выражения языка выражений оцениваются на сервере перед отправкой разметки в браузер.

#{foo = bar} не является допустимым выражением EL.= не является действительным оператором в EL.EL не имеет оператора присваивания.Единственный способ присвоить значения через EL - это использовать привязку значений в атрибутах, которые их поддерживают (почти исключительно через элементы управления вводом JSF).


Если вычисляется это выражение:

#{rich:clientId(id)}

Это выражение будет искать в областях request , application и application , использующих getAttribute("id"), используя механизмы управляемого компонента для создания такого компонента, если он определен с помощьюэтот идентификаторКогда это вычисляется и возвращает ноль, ничего не будет отображено.


Если это выражение не вычислено:

#{rich:clientId(id)}

Затем оно помещается втекст шаблона (возможно, в JSP 2.0 / J2EE 1.4.)

Существует два типа выражения EL:

  • #{foo} - отложенное выражение : только оцениваетсяв атрибутах, которые позволяют им
  • ${foo} - непосредственное выражение : разрешено в тексте шаблона

Начиная с JSP 2.1, ошибка перевода иметьотложенное выражение в тексте шаблона.Из спецификации JSP 2.1:

При использовании в тексте шаблона на странице JSP последовательность символов #{ вызывает ошибку перевода, если это специально не разрешено в настройке конфигурации.Это связано с тем, что синтаксис #{} связан исключительно с отложенной оценкой в ​​JSP 2.1 и не имеет смысла в контексте текста шаблона (в тексте шаблона имеет смысл только немедленная оценка с использованием синтаксиса ${expr}).

В файле тега #{expr} в тексте шаблона обрабатывается в соответствии с версией JSP файла тега: Если версия JSP файла тега составляет 2.0 или менее, #{expr} в тексте шаблона не вызовет никаких ошибок.Если версия JSP файла тега равна или больше 2,1, #{expr} в тексте шаблона должно вызвать ошибку, если только он не был экранирован или файл тега не содержит атрибут директивы тега deferredSyntaxAllowedAsLiteral, установленный в TRUE.

Обычно выражения #{foo} должны быть только в управляющих атрибутах JSF (для представлений JSP).


Если вы хотите изменить значение на стороне сервера, используйте отправку формыи действие обязательное.Это можно сделать с помощью AJAX в RichFaces.

...