2010-07-26 9 views
6
बदल दिया गया है

समस्या इस तरह है, एक वेबपृष्ठ में कई रूप तत्व होते हैं, जिन्हें उपयोगकर्ता द्वारा सहेजे गए बटन से सहेजा और सहेजा जा सकता है, या परिवर्तनों को त्याग दिया जा सकता है।विकेट: सूचित करें अगर पेज मॉडल

उपयोगकर्ता परिवर्तन किए बिना इसे पृष्ठ से नेविगेट करने का प्रयास करते हैं, तो मैं पूछ हमें पॉप अगर उपयोगकर्ता पेज रवाना होने से पहले परिवर्तनों को सहेजना चाहते हैं मोडल विंडो की जरूरत है।

मैं यह देखने के लिए कैसे जाउंगा कि किसी उपयोगकर्ता द्वारा पृष्ठ/फ़ॉर्म मॉडल को पहले लोड किया गया था या नहीं, और जब कोई पेज लिंक क्लिक किया जाता है तो मैं इस चेक को कैसे शुरू कर सकता हूं?

किसी भी प्रतिक्रिया या सुझाव बहुत सराहना की जाएगी,

धन्यवाद।

उत्तर

4

मैं तुम्हें एक जावास्क्रिप्ट-एकमात्र समाधान है, आमतौर पर एक विकेट व्यवहार के रूप में पैक तलाश कर रहा होगा लगता है।

var windowdirty = false; 
var windowdirtyinitialized = false; 

function initwindowdirty(){ 
    if(windowdirtyinitialized)return; 
    windowdirtyinitialized=true; 

    Event.observe(window,"beforeunload",function(){ 
     return (!windowdirty || 
      confirm("You have started entering values, do you really want to leave"); 
    }); 
} 

function monitor(componentId){ 
    $(componentId).observe("change",function(){ 
     windowdirty = true; 
    }); 
} 

function undirty(){ 
    windowdirty=false; 
} 

हम एक फ़ाइल DontLeaveBehavior.js

यहाँ कहा जाता है में इस डाल देता हूँ है एक व्यवहार इस जावास्क्रिप्ट फ़ाइल का उपयोग करता है:

कार्यान्वयन जावास्क्रिप्ट पुस्तकालय आप उपयोग पर निर्भर करता है, यहाँ कुछ प्रोटोटाइप कोड है :

public class DontLeaveBehavior extends AbstractBehavior{ 

    /** 
    * {@inheritDoc} 
    */ 
    @Override 
    public void renderHead(final IHeaderResponse response){ 
     response.renderJavascriptReference(new JavascriptResourceReference(DontLeaveBehavior.class, 
      "DontLeaveBehavior.js")); 
     response.renderOnDomReadyJavascript("initwindowdirty();"); 
     super.renderHead(response); 
    } 

    /** 
    * {@inheritDoc} 
    */ 
    @Override 
    public void bind(final Component component){ 
     super.bind(component); 
     component.setOutputMarkupId(true); 
    } 

    /** 
    * {@inheritDoc} 
    */ 
    @Override 
    public void onRendered(final Component component){ 
     final Response response = RequestCycle.get().getResponse(); 
     response.write(JavascriptUtils.SCRIPT_OPEN_TAG); 
     response.write("monitor('" + component.getMarkupId() + "');"); 
     response.write(JavascriptUtils.SCRIPT_CLOSE_TAG); 
    } 

} 

अब यहाँ एक पृष्ठ है कि स्वचालित रूप से इसे सभी के लिए इस व्यवहार प्रदान करती है बच्चों कि पाठ घटक हैं है:

public class Mypage extends WebPage{ 

    ... 

    private boolean behaviorAssigned = false; 

    /** 
    * {@inheritDoc} 
    */ 
    @Override 
    protected void onBeforeRender(){ 
     if(!behaviorAssigned){ 
      behaviorAssigned=true; 
      visitChildren(new IVisitor<Component>(){ 

       @Override 
       public Object component(Component component){ 
        if(component instanceof AbstractTextComponent<?>){ 
         component.add(new DontLeaveBehavior()); 
        } 
        return null; 
       } 
      }); 
     } 
     super.onBeforeRender(); 
    } 

} 

और अंतिम लेकिन कम से कम नहीं, आपके सबमिट बटन को undirty() पर कॉल करना होगा।

इनमें से कोई भी परीक्षण नहीं किया गया है, क्योंकि मुझे अब अपनी पत्नी & बच्चों के साथ रात्रिभोज करने के लिए घर जाना है (जो निश्चित रूप से विकेट कोडिंग से भी अधिक मजेदार है), लेकिन यह आपको शुरू करना चाहिए।

प्रोटोटाइप विशिष्ट भाग आसानी से किसी भी अन्य जावास्क्रिप्ट lib में पोर्ट जाना चाहिए, लेकिन आप शायद एक lib के बिना यह नहीं करना चाहिए अगर आप आप क्या कर रहे पता नहीं है।


संपादित करें:

मुझे लगता है कि प्रोटोटाइप और mootools और posted it on my weblog साथ काम करता है इस का एक नया संस्करण बनाया है। यह संस्करण केवल फॉर्म घटक में स्थापित है और स्वचालित रूप से जावास्क्रिप्ट के माध्यम से बच्चों को खुद को जोड़ता है।

संपादित करें फिर से: वहाँ, अब लिंक काम कर रहा है

+0

अपने जवाब के लिए धन्यवाद, लेकिन ऐसा लगता है ग्राहक मोडल विंडो होने के लिए पॉपअप चाहता है। इसलिए जावास्क्रिप्ट का उपयोग करना सबसे अच्छा समाधान नहीं हो सकता है। खेद है कि मैंने इस सवाल में उल्लेख नहीं किया था। मैं बाकी पर एक नज़र डालेगा, मुझे यकीन है कि मैं कुछ उपयोग कर सकता हूं :) धन्यवाद! अगर मैं अपनी समस्या का समाधान करता हूं तो मैं आपका जवाब चिह्नित करूंगा। – Jivings

+0

क्षमा करें, मैंने गलत विधि नाम दर्ज किया है। यह 'पुष्टि' है, न कि 'प्रॉम्प्ट'। और हाँ, यह एक मोडल विंडो है और नहीं, आप बिना जावास्क्रिप्ट के एक बना सकते हैं। हालांकि, मैं थोड़ा और सुरुचिपूर्ण समाधान पर काम कर रहा हूं जिसे मैं जल्द ही पोस्ट करूंगा। –

+2

नया संस्करण उपलब्ध है, मेरा अपडेट देखें। –

संबंधित मुद्दे