Estou estudando o JSF, e me deparei com o seguinte problema: Como carregar tem tempo de execução vários xhml dentro de algum container?
Ex.: Tenho uma página index.xhtml com links que serão criados em tempo de execução para várias abas. Quando eu clicar em um link, será carregado o xhtml correspondente. Se eu clicar em uma aba já carregada, a mesma será apenas ativada.
Não descobri uma maneira de fazer usando os recursos do próprio JSF. Consigo fazer com jQuery da seguinte forma:
index.xhtml
<div id="links">
<h:link value="Carregar" outcome="aba" />
</div>
<div id="workspace">
</div>
aba.xhtml
<div>
<p>
Aba: <h:outputText value="#{app.nomeAba}" />
<br />
<h:outputText value="#{app.hora}" />
</p>
<p:spinner /> <-------------- Aqui dá problema
<hr />
</div>
javascript
$(document).ready(function() {
$("#links a").click(function (e) {
e.preventDefault();
// ...
$("<div></div>").appendTo("#workspace").load($(this).attr("href"));
});
});
Isso funciona, o problema é que os componentes do primefaces usados dentro de um xhtml da subpágina não funcionam. Depurando no firefox com o firebug aparece a seguinte mensagem: [color=red]PrimeFaces is not defined[/color].
O primefaces tem o componente tabView que funciona quase perfeito, mas surge um problema quando eu criar a nova aba, no update, ele renderiza todo a tabView e não somente a aba criada. Ou seja, a primeira aba é criada e algum valor é alterado nos campos de entrada, daí se abrir uma nova aba, esses valores são redefinidos.
<h:commandButton value="Nova aba" action="#{app.adicionarAba}">
<f:ajax render="abas" />
</h:commandButton>
<p:tabView id="abas" binding="#{app.abas}"></p:tabView>
e na controller
@ManagedBean(name = "app")
@ApplicationScoped
public class AppController {
private TabView abas;
public AppController() {
abas = new TabView();
}
public TabView getAbas() {
return abas;
}
public void setAbas(TabView tabView) {
this.abas = tabView;
}
private int idTb = 2;
public void adicionarAba() {
Tab tab = new Tab();
tab.setId("tab" + Integer.toString(idTb++));
tab.setTitle("Teste " + getHora());
InputText inputtext = new InputText();
inputtext.setLabel("bla blab la");
inputtext.setValue(getHora());
tab.getChildren().add(inputtext);
abas.getChildren().add(tab);
}
// ...
}
Já pesquisei bastante a net sobre isso, e não consegui encontrar alguma solução.
Desde já agradeço a colaboração de que tentar ajudar.