(JSF/Primefaces) Atualizar o <p:selectOneMenu depois de alterado no MB

7 respostas
J

Tenho uma situação que tenho uma lista de motoristas para ser selecionado.

Porém, caso seja selecionado e em outro não tenha sido selecionado nada ainda, isso é verificado no Bean, ele deverá retornar para "nada selecionado", não estou conseguindo:

<p:selectOneMenu id="campoMotorista"
	value="#{ctrcBean.ctrc.motorista}" effect="fade" filter="true"
	filterMatchMode="startsWith" styleClass="full-width"
	valueChangeListener="#{ctrcBean.motoristaChangeListener}"
	label="#{msg['label.cte.motorista']}">
	<f:selectItem itemLabel="Selecione" itemValue="" />

	<f:selectItems value="#{ctrcBean.motoristas}" />

         <!-- Acredito que o problema esteja aqui -->
	<p:ajax event="change" process="@this" render="@this"
		update="@this,panelInfoCarga,:formCtrc:growlCte" />

	<f:converter binding="#{motoristaConverter}" />

</p:selectOneMenu>
No Bean:
public void motoristaChangeListener(ValueChangeEvent event) {
		if (event.getNewValue() instanceof Motorista) {
			if (this.ctrc.getRemetente().getId() != null && this.ctrc.getDestinatario().getId() != null) {
				Motorista motorista = (Motorista) event.getNewValue();
				this.ctrc.setMotorista(motorista);

				if (motorista.getVeiculos().size() > 0) {
					Veiculo veiculo = motorista.getVeiculos().get(0);
					this.ctrc.setVeiculo(veiculo);
				}
			} else {
				this.ctrc.setMotorista(new Motorista());
				this.ctrc.setVeiculo(new Veiculo());
				
				// aviso para escolher remetente e destinatário
				Util.addError("Aviso",
						Util.getMessageBundle("label.cte.msg.erro.remetente.dest"));
			}
		} else {
			// Deselecionou o motorista

		}
	}
Alguém sabe como fazer isso?

7 Respostas

R

Não entendi muito bem o seu problema.

Pela sua descrição eu entendi que existem 2 componentes selectOneMenu, correto? Tente descrever melhor o que deve acontecer nas interações entre eles, e o que está dando errado no seu caso.

J

Simplificando,

Preciso que se um valor for FALSE no bean esse <p:selectOneMenu volte para a posição “Selecione”.

Por exemplo quando a chamada ajax finaliza ele renderiza um botão, no caso daquele FALSE o botão não deverá ser renderizado.

Obrigado por tentar ajudar.

R

Você não pode simplesmente setar esse valor no seu valueChangeListener caso receba esse false?

J

Mas eu fiz isso o problema é que na tela ele não atualiza o componente.

No meu bean nesse momento está assim (sem resolver):
public void motoristaChangeListener(ValueChangeEvent event) {
		boolean remetDestOk = this.ctrc.getRemetente().getId() != null && this.ctrc.getDestinatario().getId() != null;
		if (remetDestOk) {
                   ...
		} else {
			// essa linha já coloca o valor que na tela deveria atualizar para a
			// primeira posição da lista
			this.ctrc.setMotorista(new Motorista());
			this.ctrc.setVeiculo(new Veiculo());
			
			RequestContext.getCurrentInstance().execute("removerBtnImportarNota();");

			// aviso para escolher remetente e destinatário
			Util.addError("Aviso", Util.getMessageBundle("label.cte.msg.erro.remetente.dest"));

		}
	}
R

Na verdade não, o seu Selecione está definido assim:<f:selectItem itemLabel="Selecione" itemValue="" />o que não é igual a uma instância nova de Motorista, o ideal nesse caso seria você definí-lo assim: <f:selectItem itemLabel="Selecione" itemValue="null" />e quando receber esse false setar o motorista para null

J

Alterei para fazer a comparação com o null no motorista mas não deu certo.

Ele termina a chamada e na tela continua selecionado o item que foi selecionando antes da chamada ajax.

<p:selectOneMenu id="campoMotorista"
	value="#{ctrcBean.ctrc.motorista}" effect="drop" filter="true"
	filterMatchMode="startsWith" styleClass="full-width"
	valueChangeListener="#{ctrcBean.motoristaChangeListener}"
	label="#{msg['label.cte.motorista']}">

	<f:selectItem itemLabel="Selecione" itemValue="#{null}" />

	<f:selectItems value="#{ctrcBean.motoristas}" />

	<p:ajax event="change" process="@this" render="@form"
		update="@this,panelInfoCarga,:formCtrc:growlCte" />

	<f:converter binding="#{motoristaConverter}" />

</p:selectOneMenu>
Bean:
public void motoristaChangeListener(ValueChangeEvent event) {
		boolean remetDestOk = this.ctrc.getRemetente().getId() != null && this.ctrc.getDestinatario().getId() != null;
		if (remetDestOk) {
			if (event.getNewValue() != null) {
				Motorista motorista = (Motorista) event.getNewValue();
				this.ctrc.setMotorista(motorista);

				if (motorista.getVeiculos().size() > 0) {
					Veiculo veiculo = motorista.getVeiculos().get(0);
					this.ctrc.setVeiculo(veiculo);
				}
			} else {
				// Deselecionou o motorista

			}
		} else {
			// essa linha já coloca o valor que na tela deveria atualizar para a
			// primeira posição da lista
			this.ctrc.setMotorista(null); // SETANDO para null - NÃO resolveu
			this.ctrc.setVeiculo(new Veiculo());
			
			RequestContext.getCurrentInstance().execute("removerBtnImportarNota();");

			// aviso para escolher remetente e destinatário
			Util.addError("Aviso", Util.getMessageBundle("label.cte.msg.erro.remetente.dest"));

		}
	}
J

Cara, resolvi assim:

Criado 5 de junho de 2014
Ultima resposta 5 de jun. de 2014
Respostas 7
Participantes 2