2012-10-13 25 views
37

मैं अपने स्वयं के ईवेंट श्रोताओं को एंगुलरजेएस ऐप में कैसे पंजीकृत करूं?AngularJS में अपने स्वयं के कार्यक्रम श्रोताओं को कैसे पंजीकृत करें?

विशिष्ट होने के लिए, मैं ड्रैग एंड ड्रॉप (डीएनडी) श्रोताओं को पंजीकृत करने की कोशिश कर रहा हूं ताकि जब मेरे दृश्य के नए स्थान पर कुछ खींचा और गिरा दिया जाए, तो AngularJS व्यापार तर्क को पुन: गणना करता है और मॉडल और फिर दृश्य को अद्यतन करता है।

उत्तर

8

निर्देशन में ईवेंट हैंडलिंग और डोम हेरफेर छुपाएं कोणीय तरीके से बहुत अधिक है। कॉलिंग स्कोप। $ जब कोई इवेंट आग दृश्य को अपडेट करने के लिए कोणीय को बताता है तो लागू होता है।

आप in this sample तरह jQuery ui को विचार कर सकते हैं (angular wiki of examples मैं angular-ui समूह के साथ काम करते हैं और वहाँ एक साधारण घटना आवरण जो आपके लिए उपयोगी हो सकता है।

+1

आपकी प्रतिक्रिया के लिए धन्यवाद। मैं angularjs के लिए बहुत नया हूँ और मुझे यकीन नहीं है कि मैं इसे सही ढंग से उपयोग कर रहा हूँ। किसी भी दर पर, मैंने आपके jquery-ui नमूना ऐप को देखा और मुझे यह भी यकीन नहीं था कि jquery-ui निम्नलिखित निर्देशों के अलावा चित्र में कैसे आया: jqui-drag-start, jqui-drag-end, jqui-drop- स्वीकार करें, और jqui-drop-commit। क्या वो सही है? क्या यह सच है? मैं JQuery यूआई साइट पर गया लेकिन वहां इन निर्देशों को नहीं देखा। तो वे कहाँ से आए थे? ऐसा लगता है कि निर्देश घटनाएं हैं और जो कुछ भी हम उन्हें बराबर सेट करते हैं वे हैंडलर हैं। क्या वो सही है? –

+0

ऐसा लगता है कि आपने दो निर्देश बनाए हैं (jqui-drag-start और jqui-drag-end)? –

+0

मैं अब निर्देश बनाने के तरीके पर पढ़ रहा हूं ... –

47

एक घटना श्रोता जोड़ना जोड़ने विधि में किया जा जाएगा निर्देश के तहत। नीचे मैंने बुनियादी निर्देशों के कुछ उदाहरण लिखे हैं। हालांकि, यदि आप jquery-ui's .draggable() और .droppable() का उपयोग करना चाहते हैं, तो आप क्या कर सकते हैं यह पता है कि elemlink में पैरा नीचे प्रत्येक निर्देश वास्तव में एक jQuery ऑब्जेक्ट है। तो आप elem.draggable() पर कॉल कर सकते हैं और जो भी आप वहां करने जा रहे हैं वह करें।

यहाँ एक निर्देश के साथ कोणीय में dragstart बंधन का एक उदाहरण है:

app.directive('draggableThing', function(){ 
    return { 
     restrict: 'A', //attribute only 
     link: function(scope, elem, attr, ctrl) { 
     elem.bind('dragstart', function(e) { 
      //do something here. 
     }); 
     } 
    }; 
}); 

यहाँ आप कि कैसे उपयोग करेंगे।

<div draggable-thing>This is draggable.</div> 

एक div या कोणीय के साथ कुछ करने के लिए ड्रॉप बंधन का एक उदाहरण।

app.directive('droppableArea', function() { 
    return { 
     restrict: 'A', 
     link: function(scope, elem, attr, ctrl) { 
      elem.bind('drop', function(e) { 
       /* do something here */ 
      }); 
     } 
    }; 
}); 

यहां बताया गया है कि आप इसका उपयोग कैसे करेंगे।

<div droppable-area>Drop stuff here</div> 

मुझे उम्मीद है कि इससे मदद मिलती है।

+0

मैं वास्तव में आपको AngularJS के साथ अपना अनुभव साझा करने के लिए समय निकालने की सराहना करता हूं। चूंकि मैं एंगुलरजेएस को इतना जानता हूं, इसलिए मैं इस बिंदु पर पानी को अन्य तीसरे पक्ष के पुस्तकालयों के साथ नहीं जोड़ना पसंद करता हूं; तो मैं निश्चित रूप से सभी AngularJS समाधान की तलाश में हूं। तो क्या मैं सही समझता हूं, निर्देश मूल रूप से एक घटना है? या यह केवल एक घटना रजिस्टर कर सकते हैं? मैं इन निर्देशों के साथ कुछ और खेलूँगा और जो कुछ मैंने सीखा है उसे वापस रिपोर्ट करें। धन्यवाद! –

+0

निर्देश एक कोणीय के लिए तार है। यह आपके मार्कअप से तत्वों और विशेषताओं में आपके जेएस कोड में जोड़ने का काम करता है। इसलिए, नियंत्रक केवल तर्क और नियम हैं, टेम्पलेट्स आपके यूआई हैं, और निर्देश ($ स्कोप के साथ) वे हैं जो उन्हें एक साथ जोड़ते हैं। –

+3

जब भी आपको कुछ ऐसा करने की आवश्यकता होती है तो आप निर्देश का उपयोग कर सकते हैं और उपयोग करना चाहिए: 1. एक पुन: प्रयोज्य नियंत्रण। 2. डोम हेरफेर। 3. घटना बाध्यकारी। आदि –

3

बेन द्वारा अच्छा समाधान लेकिन ध्यान रखें कि आपको originalEvent और मूल तत्व तक पहुंचने की आवश्यकता होगी। मोज़िला प्रलेखन के अनुसार दो शर्तों को पूरा करना होगा https://developer.mozilla.org/en-US/docs/DragDrop/Drag_Operations

  1. खींचने योग्य dragstart के लिए सच
  2. श्रोता है

तो निर्देश लग सकता है इस

app.directive('draggableThing', function() { 
    return function(scope, element, attr) { 
     var pureJsElement = element[0]; 
     pureJsElement.draggable = true; 
     element.bind('dragstart', function(event) { 
      event.originalEvent.dataTransfer.setData('text/plain', 
           'This text may be dragged'); 
     //do something here. 
     }); 
    } 
}); 

कदम उदाहरण के द्वारा एक अच्छा कदम की तरह कुछ यहां उपलब्ध है http://blog.parkji.co.uk/2013/08/11/native-drag-and-drop-in-angularjs.html