2013-02-08 4 views
0

Как получить clientId для фишки, включенного в ui: include?Извлечь идентификатор клиента для фишек

Для многоразового компонента я использую этот синтаксис: cc.clientId.

EDIT1

Вопрос в контексте Determine absolute id. Для включения динамических редакторов я использую custom include.

Исходный код DynamicInclude, DynamicIncludeComponent и DynamicIncludeHandler можно найти по адресу: http://pastebin.com/5e2dgR15. Мне пришлось удалить строки, которые протестировали src для null в методе DynamicInclude в getSrc и изменили значение getFamily, чтобы вернуть ненулевое значение. Это единственная реализация динамических включений, которые я мог бы найти и использовать в моем случае. На данный момент у меня нет знаний, чтобы сделать лучшее. Наличие динамического включения имеет решающее значение для моего проекта, потому что оно используется во многих местах (@BalusC: мне было бы приятно видеть, что такой компонент добавляется в OmniFaces, если это возможно).

Мои проблемы с абсолютным идентификатором клиента связаны с тем, как генерируется идентификатор для <custom:include>. В моем случае tabs:0:editorsGroup:4:editor3. Я видел, что именованные контейнеры, такие как <p:dataTable> или <p:tabView>, добавьте номер в идентификатор (вкладки: 0, редакторыГруппа: 4). Я не уверен, что этот обычай включает 100% NamingContainer. DynamicIncludeComponent реализует NamingContainer, но я не могу использовать абсолютный идентификатор клиента как :tabs:editorsGroup:editor.

Редактор organizationUnit от Determine absolute id, Я использовал обходной путь в обновлении для absolute_id_of_organization_unit. С #{eval.getAbsoluteId(cc.clientId, 'organizationUnit') был вычислен абсолютный идентификатор клиента после удаления некоторых частей cc.clientId.

Я попытался сделать обновление с помощью <p:remoteCommand>, но это не сработало. Поэтому я подумал, что могу сделать аналогичное обходное решение, как для редактора organizationUnit. Для этого мне пришлось получить родительский id, первый параметр для метода getAbsoluteId.

Это причины моей странной просьбы.

+0

У меня есть вопрос с конкретными функциональными требованиями. – Seitaridis

+0

Помимо конкретного вопроса, для которого мне нужно сначала окутать голову, работает ли этот компонент в MyFaces? – BalusC

+0

Я могу передать необходимый id в пользовательский код с помощью '', например: '', но у меня есть проблемы с использованием этого значения в атрибуте обновления. Ошибка: SEVERE: javax.faces.FacesException: не удается найти компонент с идентификатором ": form: tabs: 1: editorsGroup: 1: editor2: роли, на которые ссылаются «form: tabs: 1: editorsGroup: 1: editor2: databases: 0: j_id1533934859_460afa94». – Seitaridis

ответ

0

Я решил проблему, создав функцию, похожую на #{p:component(componentId)}. Это дополнение для возврата идентификатора клиента, оно также удаляет информацию индекса строки из сгенерированного идентификатора клиента.

Функция определена в WEB-INF/utils так:

... doctype ommited 
<facelet-taglib xmlns="http://java.sun.com/JSF/Facelet"> 
    <namespace>geneous.client.jsf/utils</namespace> 
    <function> 
     <function-name>absolute</function-name> 
     <function-class>com.acme.util.ComponentUtils</function-class> 
     <function-signature>java.lang.String getAbsoluteClientId(java.lang.String)</function-signature> 
    </function> 
</facelet-taglib> 

Внутри web.xml

<context-param> 
    <param-name>javax.faces.FACELETS_LIBRARIES</param-name> 
    <param-value>/WEB-INF/utils/utils.taglib.xml</param-value> 
</context-param> 

Пример кода из функции:

public static String getAbsoluteClientId(String id) { 
    final String clientId = removeRowIndexFromClientId(id); 
    FacesContext facesContext = FacesContext.getCurrentInstance(); 
    final char separator = UINamingContainer.getSeparatorChar(facesContext);   
    StringBuilder idBuilder = new StringBuilder(); 
    idBuilder.append(separator).append(clientId); 
    return idBuilder.toString();   
} 

public static String removeRowIndexFromClientId(String id) { 
    String clientId = findComponentClientId(id); 
    FacesContext facesContext = FacesContext.getCurrentInstance(); 
    final char separator = UINamingContainer.getSeparatorChar(facesContext); 
    final String regex = String.valueOf(separator) + "[0-9]+"; 
    return clientId.replaceAll(regex, ""); 
} 

Функция используется как #{<utils:absolute('componentId')>}.

Смежные вопросы