Генерация уникальных тегов идентификаторов в пользовательском интерфейсе: включение ресурса

#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-выражениями работает просто отлично. Я только что узнал кое-что новое 🙂

Ответ №2:

вы можете использовать:

<f:subview id="uniqueXXX">

смотрите также этот пример: