2013-02-19 27 views
10

JSF 2.0, Mojarra 2.0.1, PrimeFaces 3.4.1जावास्क्रिप्ट

इसी तरह के सवाल कर रहे हैं, लेकिन मैं sth की जरूरत के साथ समर्थन सेम मूल्य हो रही है। अन्य; जावास्क्रिप्ट फ़ंक्शन को बैकिंग बीन विधि की प्रतीक्षा करनी है, जो वेरिएबल भर रहा है जो जेएस फ़ंक्शन से खींचा जाना चाहता था। मैं क्या कहना चाहता हूं:

<p:commandLink action="#{statusBean.getStatuses}" oncomplete="afterLoad()"/> 

मान लीजिए जेएस फ़ंक्शन केवल मूल्य प्राप्त कर रहा है और इसे स्क्रीन पर प्रिंट कर रहा है। हम 3.

देखने की उम्मीद कर रहे हैं, जबकि

@ManagedBean 
@ViewScoped 
public class StatusBean { 
    public int size=0; 
    List<Status> panelList = new ArrayList<Status>(); 
    public void getStatuses() { 
     this.panelList = fillList(); 
     this.size = panelList.size(); //Assuming 3 
    } 
    //getter and setters 
} 

तो समारोह है जो इसे का प्रारंभिक मूल्य है 0 के रूप में आकार अलर्ट,:

function afterLoad() {  
    alert("#{statusBean.size}"); 
} 

और यहाँ जन्मदिन बच्चा है यह कैसे काम कर रहा है: यदि मैं बीन के सिर पर @PostConstruct एनोटेशन जोड़ता हूं तो निश्चित रूप से यह सही आकार प्राप्त हो जाता है, क्योंकि बीन पहले ही पृष्ठ लोड से पहले बनाया गया है। लेकिन इसका मतलब अनावश्यक प्रक्रियाओं, कमांडलिंक कार्रवाई के बाद आवश्यक मूल्य है। तो जेएस फ़ंक्शन को स्थगित कैसे करें? कोई विचार?

+1

Mojarra 2.0.1 प्राचीन है। यह पहले से ही 3 साल से अधिक पुराना है। उन्नयन पर विचार करें। वर्तमान 2.1.1 9 संस्करण में कई, कई बगफिक्स और सुधार हैं। – BalusC

+0

@ बाल्लूसी ठीक है, मैं संस्करण अंतरों की समीक्षा करने जा रहा हूं, दोनों उत्तरों भी सही हैं और काम कर रहे हैं और partlov धन्यवाद लेकिन मैं यह तय नहीं कर सका कि किसको उत्तर के रूप में चुना जाना चाहिए। क्या मुझे पहले पहली बार सेवा के आधार पर चुनना चाहिए? लेकिन सर्वर का कहना है कि आपने 1 मिनट पहले उत्तर दिया था, लेकिन जब मैंने पिछली बार देखा तो यह कह रहा था कि partlov पहले जवाब दिया था। क्या यह एक ही समय है? –

+0

बस वह चुनें जो आपके लिए सबसे उपयोगी है।अभी तक पोस्ट किए गए उत्तरों बिल्कुल वही जानकारी प्रदान नहीं करते हैं। सटीक उत्तर टाइमस्टैप के रूप में, बस "उत्तर" टाइमस्टैम्प के टूलटिप की जांच करें। लेकिन आपको इसका जवाब चुनने पर विचार नहीं करना चाहिए। यह केवल एफजीआईटीडब्ल्यू को अनुकरण करता है। – BalusC

उत्तर

17

जेएसएफ/ईएल और एचटीएमएल/जेएस सिंक में नहीं चलते हैं। इसके बजाय, जेएसएफ/ईएल वेबसर्वर में चलाता है और एचटीएमएल/जेएस उत्पन्न करता है जो बदले में वेबब्रोसर में चलता है। ब्राउज़र में ओपन पेज, राइटक्लिक और स्रोत देखें। आप देखते हैं, जेएसएफ/ईएल की कोई भी पंक्ति नहीं है। यह एक और सभी एचटीएमएल/जेएस है। अपने जेएस फ़ंक्शन के स्थान पर, आप देखेंगे:

function afterLoad() {  
    alert("0"); 
} 

बिल्कुल यह जेएस फ़ंक्शन आपके कमांड बटन कार्रवाई को पूरा करने पर लागू होता है। तो परिणाम पूरी तरह से उम्मीद है।

असल में, आप जेएसएफ को जेएस के उस हिस्से को दोबारा प्रस्तुत करना चाहते हैं।

<p:commandLink action="#{statusBean.getStatuses}" update="afterLoad" oncomplete="afterLoad()"/> 
<h:panelGroup id="afterLoad"> 
    <h:outputScript> 
     function afterLoad() {  
      alert("#{statusBean.size}"); 
     } 
    </h:outputScript> 
</h:panelGroup> 

कंक्रीट कार्यात्मक आवश्यकता के आधार पर, जिसे आपने कुछ भी नहीं बताया, वहां और अधिक सुरुचिपूर्ण तरीके हो सकते हैं। उदाहरण के लिए, RequestContext#execute(), <o:onloadScript>, आदि

+0

बलुस, आप चट्टान हैं :) – Anatoly

+2

यह एक पुराना धागा है .. लेकिन मेरे पास एक सवाल है .. अगर मैं बाहरी जावास्क्रिप्ट फ़ाइल का उपयोग कर रहा हूं तो इसे कैसे पूरा किया जाए? कृपया मेरी मदद करें। – hermit

8

आपकी जावास्क्रिप्ट में ईएल की गणना तब की जाती है जब पृष्ठ प्रस्तुत किया जाता है और आप इसके कंटेनर को अपडेट कर सकते हैं (यदि यह कुछ जेएसएफ घटक में है), लेकिन मैं एक और दृष्टिकोण सुझाऊंगा।

जैसा कि आप AJAX अनुरोध कर रहे हैं, आप getStatuses() विधि में कॉलबैक पैरामीटर जोड़ सकते हैं। आप इस के लिए Primefaces के RequestContext उपयोगिता विधि addCallBackParam() उपयोग कर सकते हैं:

public void getStatuses() { 
    this.panelList = fillList(); 
    this.size = panelList.size(); 
    RequestContext.getCurrentInstance().addCallBackParam("size", this.size); 
} 

और आप एक्सएचटीएमएल में इस पैरामीटर का उपयोग कर सकते हैं:

<p:commandLink action="#{statusBean.getStatuses}" oncomplete="afterLoad(xhr, status, args)"/> 

<script type="text/javascript"> 
    function afterLoad(xhr, status, args) {  
    alert(args.size); 
    } 
</script> 
+0

इस महान उत्तर के लिए धन्यवाद, आपने आज मेरे दोस्त को बहुत मदद की! –

+0

आपका स्वागत है। – partlov

+0

फिर से हैलो, मुझे 'addCallBackParam' के बारे में कोई समस्या है। पहली आवेषण पर 'afterLoad (xhr, status, args) 'का उपयोग करते समय यह सही काम करता है। लेकिन अगर मैं इसे 'getStatuses()' का उपयोग करके दूसरी बार कॉल करना चाहता हूं, तो बाद में लोड विधि 'आकार' में 'अपरिभाषित' हो जाता है। ऐसा लगता है कि यह दूसरे आमंत्रण पर कॉल बैक परम को सही ढंग से जोड़ नहीं सकता है। दूसरे आवेषण के साथ मेरा क्या मतलब है: उदाहरण के लिए उपयोगकर्ता एक स्थिति जोड़ता है और उसके बाद सफलतापूर्वक काम करता है, लेकिन यदि उपयोगकर्ता किसी स्थिति को हटा देता है, तो मैंने 'रिमोट कमांड' को परिभाषित किया है, यह 'statusBean.getStatuses' कहता है और इसमें 'अपूर्ण = "है प्रकुंचन दाब (XHR, स्थिति, args) '। –