2012-11-20 8 views
6

Korzystam z Primefaces 3.4.1 z wersją jądra 2.2.0-m05 implementacji Oracle JSF 2.2. Używam również Spring 3.1 do iniekcji zależności i niektórych AOP.Jak uzyskać dostęp do bieżącego TreeNode w drzewie PrimFaces (w znaczniku lub programowo) bez wiązania z komponentem UI w zarządzanym komponencie bean?

Próbuję użyć komponentu drzewa Primefaces do wyświetlenia złożenia logicznych reguł filtrowania (i umożliwić użytkownikowi tworzenie węzłów złożonych/liściowych na dowolnej głębokości w strukturze złożonej).

przykład filtr złożony:

((location = 'CAL') i (opis zawiera 'test')), lub (projekt = 'someProject')

Przykład drzewa znaczników:

<p:tree value="#{form.rootComponent}" var="filterComponent" animate="true"> 

    <p:treeNode type="composite"> 
     <!-- some composite specific components --> 
    </p:treeNode> 

    <p:treeNode type="leaf"> 
     <!-- some leaf specific components --> 
    </p:treeNode> 

</p:tree> 

Mimo że atrybut "value" elementu akceptuje root TreeNode (pobrany z zarządzanego komponentu bean), atrybut "var" wskazuje na rzeczywiste dane obecne w bieżącym węźle drzewa, a nie na samym węźle. Chciałbym uzyskać dostęp do bieżącego węzła drzewa, a nie jego zapakowanych danych, w mark-up lub programowo.

Jeśli mogę uzyskać do niego dostęp w marżach, mogę przekazać go jako argument metody do zarządzanego komponentu bean. Jeśli nie ma możliwości dostępu do niego w marży, czy mogę uzyskać bezpośredni dostęp programowy za pośrednictwem obiektu modelu? (przypuszczalnie przez uzyskanie dostępu do bazowego modelu drzewa?).

Wiem, że można użyć wyrażenia, które przekształca się w dane moduł danych zamiast zbierania danych bezpośrednio jako "wartość" h: dataTable, ale uważam, że można używać tylko węzeł główny z p: drzewo.

Mogę dołączyć odniesienie do węzła drzewa w owiniętym obiekcie danych, ale wolałbym raczej unikać nieprzyjemnych odwołań cyklicznych, jeśli to w ogóle możliwe.

W przypadku braku lepszej alternatywy, próbowałem użyć atrybutu "binding" do powiązania elementu p: tree bezpośrednio do instancji Tree w zarządzanym komponencie bean (Tree będącym klasą UIComponent dla p: tree), która pozwala mnie, aby uzyskać dostęp do bieżącego węzła za pomocą metody getTreeNode(), ale wolałbym uniknąć tego z uwagi na niedopasowanie cyklu życia między zarządzanymi komponentami bean a komponentami widoku. Nie działa tak doskonale, jak jest, i zakładam, że musi być o wiele lepsze, prostsze rozwiązanie.

Próbowałem także użyć tabeli danych jsf - z zagnieżdżonymi tabelami danych do obsługi części złożonej - ale zdecydowałem się na nią z uwagi na trudność w tworzeniu warunkowej struktury rekursywnej w znacznikach jsf (uważam, że atrybut "renderowany" nie jest oceniany w widoku czasu budowy, więc trudno uniknąć nieskończonej rekurencji).

Aby wyjaśnić, interesuje mnie tylko aktualny węzeł drzewa zawierający dane, do których odnosi się "var", a nie węzeł aktualnie wybrany przez użytkownika.

+0

bez wybierania węzła, Jak uzyskać bieżący węzeł drzewa? Nie zrozumiałem twojego pytania. – neni

+0

Czy próbowałeś użyć # {komponentu} w swoim znaczniku? który ma zostać rozwiązany na bieżący komponent, powinien być w twoim przypadku obiektem treeNode – rootkit

Odpowiedz

0

Cóż, w składniku drzewa znajduje się atrybut o nazwie "wybór". Wystarczy podać odniesienie do metody zarządzanego komponentu bean.

Na przykład w swojej xhtml zdefiniować atrybut następujący sposób:

selection="#{myManagedBean.selectedNode}"

A z definicji powyższego atrybutu, będzie musiał dostarczyć zwykłe setter i getter metod w zarządzanym fasoli, że odniesienia do instancji org.primefaces.model.TreeNode.

6

PF Ołów właśnie dodał nowy atrybut o nazwie "nodeVar" dla p: treeTable (dunno, jeśli p: tree jest włączone) jak w PF 5.1.10/5.2. Ta funkcja pozwoli na uzyskanie rzeczywistego TreeNode zamiast danych. W związku z tym można teraz wykonywać dodatkowe wywołania metod w samym węźle, na przykład TreeNode.isLeaf().

Powiązane problemy