क्या मैं JSF बैकिंग बीन विधि से JSF घटक को अपडेट कर सकता हूं?


100

क्या जेएसएफ बैकिंग बीन के पेज पर एक घटक को अपडेट करने का एक तरीका है? मैं पेज पर एक घटक को अद्यतन करने के लिए अद्यतन विशेषता के साथ एक अजाक्स घटक का उपयोग नहीं कर रहा हूं। मुझे JSF बैकिंग बीन पद्धति के भीतर से एक अद्यतन को ट्रिगर करने की आवश्यकता है। ध्यान दें कि इस विधि के पूरा होने या इसके पूरा होने से पहले पृष्ठ पर अद्यतन हो सकता है। मैं प्राइमफेस का उपयोग कर रहा हूं, अगर कोई ऐसा समाधान है जो प्राइमफेस के उपयोग से हो सकता है।


सत्यापन त्रुटि को ट्रिगर कर सकते हैं: stackoverflow.com/a/14401741/1599699
एंड्रयू

जवाबों:


183

मानक JSF API का उपयोग करके, क्लाइंट ID को इसमें जोड़ें PartialViewContext#getRenderIds()

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

PrimeFaces विशिष्ट API का उपयोग करना, उपयोग करना PrimeFaces.Ajax#update()

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

या यदि आप PrimeFaces 6.2+ पर अभी तक नहीं हैं, तो उपयोग करें RequestContext#update()

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

यदि आप JSF उपयोगिता पुस्तकालय OmniFaces का उपयोग करते हैं, तो उपयोग करें Ajax#update()

Ajax.update("foo:bar");

चाहे जो भी हो, ध्यान दें कि उन क्लाइंट आईडी को निरपेक्ष क्लाइंट आईडी का प्रतिनिधित्व करना चाहिए जो कि विभाजक चरित्र के साथ उपसर्ग नहीं कर रहे हैं NamingContainerजैसे आप दृश्य पक्ष से करेंगे।


6
ऐसा प्रतीत होता है जैसे मैं रेंडर रिस्पांस चरण के दौरान काम करने के लिए इसे प्राप्त नहीं कर सकता (जो, दुर्भाग्य से मैं इस कोड को रखने के लिए मजबूर हूं)। यदि मैं इनवोक एप्लिकेशन या पहले के चरणों में जगह लेता हूं, तो चीजें ठीक काम करती हैं। रेंडर रिस्पांस चरण में होने के लिए कोई वर्कअराउंड?
बेस्टप्रैक्टिस

8
नहीं, बहुत देर हो चुकी है। कार्रवाई चरण को लागू करने के लिए या प्रतिक्रिया चरण प्रस्तुत करने से पहले नौकरी को स्थानांतरित करें। <f:ajax listener><f:event type="preRenderView" listener>
BalusC

जेएसएफ 1.2 के साथ कैसे करें इस पर कोई विचार? मैं एक नया प्रश्न पूछ सकता हूं यदि उत्तर बहुत लंबा / जटिल है।
रिनाल्डोप्रज्र

@RinaldoPJr: JSF 1.2 की कोई अवधारणा नहीं है <f:ajax>। यह JSF 2.0 के बाद से पेश किया गया है। आपको JSF 1.2 घटक लाइब्रेरी विशिष्ट सुविधाओं का सहारा लेना होगा।
बालुसक

@ डैनियल: कोई विचार नहीं। मैं त्रिनिदाद नहीं करता। यदि आप अभी भी त्रिनिदाद के रास्ते का पता नहीं लगा सकते हैं तो बस मानक JSF API दृष्टिकोण का उपयोग करें।
बालुस

9

मैंने jsf बैकिंग बीन / क्लास से एक घटक को अपडेट करने का भी प्रयास किया

UI घटक में हेरफेर करने के बाद आपको निम्नलिखित करने की आवश्यकता है:

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

(सर्वर-साइड) कंपोनेंटआईड के बजाय क्लाइंटआईड का उपयोग करना महत्वपूर्ण है !!


7

RequestContextहै पदावनत से Primefaces 6.2 । इस संस्करण से निम्नलिखित का उपयोग करें:

if (componentID != null && PrimeFaces.current().isAjaxRequest()) {
    PrimeFaces.current().ajax().update(componentID);
}

और इस तरह से रीढ़ की हड्डी के उपयोग से जावास्क्रिप्ट निष्पादित करने के लिए :

PrimeFaces.current().executeScript(jsCommand);

संदर्भ:


1

सब कुछ तभी संभव है जब शोध के लिए पर्याप्त समय हो :)

मुझे जो करने को मिला, वह लोगों की तरह है कि मैं एक यूआई में पुनरावृति करता हूं: इनपुट में नाम और अन्य फ़ील्ड दोहराएं और प्रदर्शित करें। लेकिन खेतों में से एक एकल था - ए और इसके आधार पर मूल्य एक और इनपुट को अपडेट करता है - बी यहां तक ​​कि ui: दोहराने में आईडी नहीं है जो मैंने डाल दिया और यह डोम ट्री में दिखाई दिया

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

Html में आईडी से कुछ इस तरह थे:

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

इस दृष्टिकोण से मुझे एक तरीका पसंद आया:

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

और इसका कार्यान्वयन सेम में था जैसे:

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

तो इस तरह मैंने सेम से तत्व को बिना किसी मुद्दे के अपडेट किया। पीएफ संस्करण 6.2

सौभाग्य और खुश कोडिंग :)


यदि आपके पास ajax परिवर्तन की घटना है personType, तो व्यक्ति और ajax श्रोता पर अनुक्रमणिका दोनों को पास करना अतिश्योक्तिपूर्ण है। आप घटना से आईडी और मूल्य दोनों प्राप्त कर सकते हैं। लेकिन आपके विशिष्ट usecase के लिए आपका समाधान एक आवश्यक हो सकता है, लेकिन चूंकि पूर्ण उदाहरण नहीं है ( न्यूनतम प्रतिलिपि प्रस्तुत करने योग्य उदाहरण स्वाद में) यह बताना मुश्किल है।
कुकटेलजे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.