2013-08-26 7 views
6

मैं एक AJAX के माध्यम से कार्रवाई को बचाने निष्पादित करने के लिए कोशिश कर रहा हूँ के बाद कुछ करो:रेल LINK_TO: <code>link_to</code> का उपयोग कर पुष्टि

<%= link_to 'Save', image_path(image), method: :patch, 
     data:{ confirm: 'Save image?', remote: true } %> 

मैं लिंक <span>Saving...</span> पुष्टि पर साथ प्रतिस्थापित किया जाना चाहते हैं, लेकिन एक को समझ नहीं सकता इसे करने का साफ तरीका।

मौजूदा समाधान के साथ कोई समस्या:

disable_with:
अगर मैं :disable_with => '<span>Saving...</span>' लिंक के भीतरी HTML लिंक खुद के बजाय बदल दिया जाएगा जोड़ें। वह नहीं चाहते हैं।

onclick :
मैं जोड़ने :onclick => "$(this).replaceWith('<span>Saving...</span>');" लिंक तुरंत बदल दिया जाएगा, उपयोगकर्ता की पुष्टि के

वहाँ एक समाधान है कि रेल 3 UJS सर्वोत्तम प्रथाओं के साथ फिट बैठता है रद्द भले ही हैं?

उत्तर

1

मुझे लगता है कि यह एक ऐसा मामला है जहां आप चाहते हैं कि कार्यक्षमता रेल के जेएस हेल्पर्स द्वारा प्रदान की जाने वाली चीज़ों से परे हो। इस बिंदु पर मैं केवल इसका उपयोग करने से बचूंगा: पुष्टि करें और: link_to के दूरस्थ विकल्प, और इसे सादे jQuery यूजेएस या इसी तरह कार्यान्वित करें।

आप लिंक को छिपाने और 'सेविंग ...' अवधि दिखाने के मामले में भी सोच सकते हैं जब उपयोगकर्ता एचटीएमएल को बदलने की बजाए पुष्टि करता है; मुझे लगता है कि यह उस तरह से सरल हो जाएगा, और फिर भी आपको वह प्रभाव देगा जो आप खोज रहे हैं।

5

आप हुक ajax:beforeSend उपयोग कर सकते हैं:

$('a#my_link_to').bind('ajax:beforeSend', function(evt, xhr, settings) { 
    $(this).replaceWith('<span>Saving...</span>'); 
}) 

और फिर आप ajax:success करने के लिए एक बाँध जोड़ सकते हैं:

$('a#my_link_to') 
    .bind('ajax:beforeSend', function(evt, xhr, settings) { 
    $(this).replaceWith('<span id="saving">Saving...</span>'); 
    }) 
    .bind('ajax:success', function(evt, data, status, xhr) { 
    $('span#saving').replaceWith('Saved!'); 
    }) 

नोट: टिप्पणी देखें जो नीचे भी बहुत महत्वपूर्ण है

+4

ध्यान दें कि सफलता हैंडलर को कभी भी कॉल नहीं किया जाता है- क्योंकि आपने '$ (यह) 'बाध्यकारी को नष्ट कर दिया है ... – Yarin

0

मुझे लगता है कि आपको पुष्टि करना चाहिए: ईवेंट पूर्ण करें। (विवरण: https://github.com/rails/jquery-ujs/blob/master/src/rails.js):, आदि

<%= link_to 'Save', image_path(image), method: :patch, 
     data:{ confirm: 'Save image?', remote: true }, 
     onclick: "$(this).one('ajax:beforeSend', 
      function(e) { $(this).replaceWith('<span>Saving...</span>'); });" %> 

(इस समाधान के साथ समस्या यह है कि संचालकों जमा करता है, तो उपयोगकर्ता क्लिक करता है, की पुष्टि नहीं करता है फिर से क्लिक करता है, ..

+0

@ हेडगेस्की- यह काम नहीं करेगा-' पुष्टि: पूर्ण 'घटना आग लगती है कि क्या पुष्टि रद्द कर दी गई थी या ठीक है। – Yarin

+0

आप सही हैं, दस्तावेज़ में वे कहते हैं: "पुष्टि करें: पूर्ण 'ईवेंट निकाल दिया गया है या नहीं, उपयोगकर्ता ने संवाद के लिए सही या गलत जवाब दिया है या नहीं" – MrYoshiji

0

यहाँ कैसे मैं यह कर समाप्त हो गया है इसलिए यह आदर्श नहीं है ...)

0

आप confirm:complete ईवेंट का उपयोग कर सकते हैं। यह एक दूसरा बूलियन तर्क पारित होता है जो बताता है कि परिणाम रद्द या ठीक था या नहीं।

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