У меня есть вопрос об идее того, что только UIForm
получил атрибут prependId
.Почему атрибут не указан в интерфейсе NamingContainer
?Теперь вы, вероятно, скажете, что это из-за обратной совместимости, но я бы предпочел нарушить совместимость и позволить пользователям, которые реализуют этот интерфейс, также реализовывать методы для prependId.
Основная проблема с моей точки зрения о prependId вUIForm
компонент состоит в том, что он сломается findComponent()
Я ожидаю, что если я использую prependId
, то поведение NamingContainer
изменится не только в отношении рендеринга, но и при поиске компонентов в дереве компонентов..
Вот простой пример:
<h:form id="test" prependId="false">
<h:panelGroup id="group"/>
</h:form>
Теперь, когда я хочу получить компонент panelGroup, я ожидаю передать строку "group"
методу findComponent()
, но он выигралНичего не могу найти, вместо этого я должен использовать "test:group"
.
Конкретная проблема заключается в том, что при использовании ajax с prependId="false"
.В обновлении и обработке атрибутов тег ajax ожидает, что значения заботятся о присвоении имен контейнерам.Немного странно, что когда я использую prependId="false"
, мне нужно указать полный идентификатор или путь, но все в порядке.
<h:form id="test" prependId="false">
<h:panelGroup id="group"/>
</h:form>
<h:form id="test1" prependId="false">
<h:commandButton value="go">
<f:ajax render="test:group"/>
</h:commandButton>
</h:form>
Хорошо, этот код будет отображаться без проблем, но не будет обновлять PanelGroup, потому чтоэто не может найти это.PartialViewContext
будет содержать только идентификатор "group"
в качестве элемента renderIds.Я не знаю, ожидается ли это, возможно, это так, но я не знаю код.Теперь мы подошли к тому, что метод findComponent()
не может найти компонент, потому что выражение, переданное в качестве параметра, равно "group"
, где метод ожидает, что "test:group"
найдет компонент.
Одним из решений являетсянапишите свой findComponent()
, который я выбрал для решения этой проблемы.В этом методе я обрабатываю компонент, который является NamingContainer
и имеет свойство prependId, установленное в false, как нормальное UIComponent
.Я должен сделать это для каждого UIComponent
, который предлагает атрибут prependId, и это плохо.Reflection поможет обойти статическое определение типов, но это все еще не совсем чистое решение.
Другим способом было бы ввести атрибут prependId в интерфейсе NamingContainer
и изменить поведение findComponent()
наработать, как описано выше.
Последнее предлагаемое решение - изменить поведение тега ajax для передачи всего идентификатора, но это только решит проблему ajax, а не программные проблемы, стоящие за реализацией findComponent()
.
Что вы думаете об этом и почему, черт возьми, это так реализовано?У меня не может быть первой проблемы с этим, но я не смог найти связанные темы?!