#jsf-2
#jsf-2
Вопрос:
Я создаю страницу, на которой будет несколько экземпляров тега, такого как следующий.
<ui:include id="foo" src="images/something.svg" />
Сервлет Faces передает svg-файл в браузер без какой-либо обработки, кроме найденных выражений EL, что нормально. Проблема в том, что теги идентификаторов во включаемом файле являются статическими, поэтому множественные включения этого файла будут генерировать неуникальные теги идентификаторов.
То, что я хочу сделать, это что-то вроде того, что делает h: form, где идентификатор тега ui: include добавляется к идентификаторам элементов во включаемом файле. Тогда я мог бы однозначно адресовать все.
Существует ли принятый способ «наилучшей практики» для этого?
ОБНОВЛЕНИЕ: возможно, мне следует дополнить этот вопрос последующим вопросом, который заключается в том, нужно ли мне это делать в первую очередь? Моя цель — однозначно адресовать теги в каждой из включенных копий документа svg, которых может быть любое количество. У меня есть jQuery, поскольку он в любом случае подключается с помощью Primefaces.
Итак, если у меня есть файл JSF, подобный этому:
<ui:include id="foo" src="images/something.svg" />
<ui:include id="bar" src="images/something.svg" />
И внутри файла something.svg у меня есть тег
<rect id="blink" ... />
В javascript на странице я хочу иметь возможность получать указатель на foo: blink или bar: blink. Полагаю, я мог бы использовать выражения XPath, но я понял, что они довольно медленные. Я не могу представить, что ребята, которые изобрели тег ui: include, не подумали о том, как с этим справиться, поэтому я предполагаю, что пропустил что-то очевидное.
Комментарии:
1. Для ясности,
something.svg
таким образом, это фактически файл Facelet?2. Нет, это просто svg-документ, начинающийся с (после заголовков) svg-тега. Это очень хорошо работает в HTML 5 для вставки динамических и интерактивных документов на страницу, и у JSF нет проблем с его генерацией. Дело в том, что сервлет Faces не обрабатывает никаких тегов ID, кроме тех, что содержатся в UIComponents, и ничто в svg-файле не является тегом, определенным JSF.
3. Но вы упомянули, что он обрабатывает выражения EL в нем? Тогда теоретически было бы возможно добавить компоненты JSF или даже сделать его просто составным компонентом, который уже получал бы автоматически созданный идентификатор.
4. Сервлет Faces действительно находит и обрабатывает EL-выражения во включенном SVG-файле. Например, вы можете выполнить <rect id=»#{bean.IdGenerator}» .. /> и таким образом сгенерировать уникальные идентификаторы. Проблема с этим подходом заключается в том, что он делает файл SVG недоступным для редактирования с помощью графических инструментов, таких как inkscape. Кроме этого, сервлет Faces просматривает все в файле SVG без интерпретации, за исключением (я предполагаю), если он находит тег в известном ему пространстве имен, таком как f: h: или ui: .
Ответ №1:
Передайте его как <ui:param>
.
<ui:include src="images/something.svg">
<ui:param name="id" value="foo" />
</ui:include>
<ui:include src="images/something.svg">
<ui:param name="id" value="bar" />
</ui:include>
Вы можете ссылаться на него по имени параметра #{id}
в EL включенного файла. Например.
<rect id="#{id}_blink" ... />
Комментарии:
1. Мне это нравится. Я не знал, что вы можете использовать ui: param таким образом. Это не мое идеальное решение, потому что я пытался избежать размещения в исходном файле svg чего-либо, что могло бы запутать редактор, подобный Inkscape. Однако я только что попробовал это, и Inkscape, похоже, не возражает против наличия выражения EL в тегах ID. Итак, я пойду с этим, если не появится что-то лучшее. Я боялся, что мне придется написать фильтр или что-то в этомроде.
2. Всегда пожалуйста. Кстати, спасибо, что поделились своим опытом, что включение SVG-файлов с подобными EL-выражениями работает просто отлично. Я только что узнал кое-что новое 🙂