Bir JSF bileşenini bir JSF destek fasulye yönteminden güncelleyebilir miyim?


100

Sayfadaki bir bileşenin güncellenmesine neden olan bir JSF Destek çekirdeğine sahip olmanın bir yolu var mı? Sayfadaki bir bileşeni güncellemek için güncelleme özniteliğine sahip bir ajax bileşeni kullanmak istemiyorum. JSF yedekleme fasulye yöntemi içinden bir güncellemeyi tetiklemem gerekiyor. Sayfadaki güncellemenin, bu yöntem tamamlandıktan sonra veya tamamlanmadan önce gerçekleşebileceğini unutmayın. PrimeFaces kullanarak elde edilebilecek bir çözüm varsa PrimeFaces kullanıyorum.


Doğrulama hatasını tetikleyebilir: stackoverflow.com/a/14401741/1599699
Andrew

Yanıtlar:


183

Standart JSF API kullanarak, istemci kimliğini PartialViewContext#getRenderIds().

FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().add("foo:bar");

PrimeFaces'e özel API kullanarak PrimeFaces.Ajax#update().

PrimeFaces.current().ajax().update("foo:bar");

Veya henüz PrimeFaces 6.2+ üzerinde değilseniz, kullanın RequestContext#update().

RequestContext.getCurrentInstance().update("foo:bar");

JSF yardımcı program kitaplığı OmniFaces kullanıyorsanız Ajax#update(),.

Ajax.update("foo:bar");

Ne olursa olsun bu müşteri kimlikleri olan mutlak müşteri kimliklerini temsil etmelidir şekilde, notun değil öneki NamingContainerüzerinde görüş taraftan yapacağı gibi gibi ayırıcı karakteri.


6
Görünüşe göre bunu Render Response aşamasında çalıştıramıyorum (ki maalesef bu kodu yerleştirmek zorunda olduğum yer). Invoke Uygulamasına veya daha önceki aşamalara yerleştirirsem, işler iyi gidiyor. Render Response aşamasında olmak için herhangi bir geçici çözüm var mı?
BestPractices

8
Hayır, çok geç. İşi eylem aşamasını başlatmak için veya işleme yanıt aşamasından önce taşıyın. Yöntemi <f:ajax listener>veya ile <f:event type="preRenderView" listener>
çağırın

Bunun JSF 1.2 ile nasıl yapılacağına dair bir fikriniz var mı? Cevap çok uzun / karmaşıksa yeni bir soru sorabilirim.
RinaldoPJr

@RinaldoPJr: JSF 1.2'nin kavramı yok <f:ajax>. Bu, JSF 2.0'dan beri tanıtılmaktadır. JSF 1.2 bileşen kitaplığına özgü tesislere başvurmanız gerekir.
BalusC

@DanielK: Fikrim yok. Trinidad yapmam. Hala Trinidad yolunu bulamıyorsanız standart JSF API yaklaşımını kullanın.
BalusC

9

Ayrıca bir jsf destek fasulyesinden / sınıfından bir bileşeni güncellemeye çalıştım

UI bileşenini değiştirdikten sonra aşağıdakileri yapmanız gerekir:

FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().add(componentToBeRerendered.getClientId())

(Sunucu tarafı) componentId yerine clientId kullanmak önemlidir !!



1

Her şey ancak araştırmak için yeterli zaman varsa mümkündür :)

Yapmam gereken şey, bir kullanıcı arayüzünde yinelediğim kişilere sahip olmak: girişlerdeki adları ve diğer alanları tekrarlayın ve görüntüleyin. Ancak alanlardan biri singleSelect - A idi ve değerine bağlı olarak başka bir girişi güncelle - B. hatta ui: tekrar koyduğum kimliği yok ve DOM ağacında belirdi

<ui:repeat id="peopleRepeat"
value="#{myBean.people}"
var="person" varStatus="status">

Html'deki kimliklerden çok şunun gibi bir şeydi:

myForm:peopleRepeat:0:personType
myForm:peopleRepeat:1:personType

Görünüme göre şöyle bir yöntem var:

<p:ajax event="change"
listener="#{myBean.onPersonTypeChange(person, status.index)}"/>

Ve uygulaması fasulyede şöyle oldu:

String componentId = "myForm:peopleRepeat" + idx + "personType";
PrimeFaces.current().ajax().update(componentId);

Böylelikle fasulyeden öğeyi sorunsuz bir şekilde güncelledim. PF sürüm 6.2

İyi şanslar ve mutlu kodlamalar :)


Ajax değişim olayına sahipseniz, personTypehem kişiyi hem de dizini ajax dinleyicisine aktarmak gereksizdir. Etkinlikten hem kimliği hem de değeri alabilirsiniz. Ancak çözümünüz, özel kullanım durumunuz için gerekli olabilir, ancak tam örnek olmadığı için ( minimum yeniden üretilebilir örnek aromasında) bunu söylemek zor.
Kukeltje
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.