2016-10-16 15 views
7

के लिए @ इनपुट पर @Output का उपयोग क्यों करें, मैं कुछ वर्षों से कोणीय 1 के साथ काम करने के बाद, कोणीय 2 सीख रहा हूं। मैं Angular2 में कुछ महत्वपूर्ण अवधारणाओं को सीखने के मुख्य लक्ष्य के साथ क्रेडिट कार्ड फॉर्म घटक बना रहा हूं। घटक को सभी स्वरूपण को संभालना चाहिए, और कॉलबैक के माध्यम से एक स्ट्रिप टोकन वापस करना चाहिए। मुझे एहसास हुआ कि मैं कॉलबैक को दो तरीकों से संभाल सकता हूं।कोणीय 2 कॉलबैक

एक @Output पैरामीटर

का उपयोग करते हुए मेरी घटक में मैं एक उत्पादन चर को परिभाषित करने और की तरह उपयोग इस उदाहरण में:

export class CreditCardForm{ 
    .... 
    @Output() callback = new EventEmitter(); 
    .... 

    doCallback(){ 
     this.callback.emit({data: 123}); 
    } 
} 

// Parent view 
<credit-card-form (callback)="creditCardCallback($event)"></credit-card-form> 

हालांकि एक @Input चर का उपयोग करना , मैं इनपुट इनपुट में कॉलबैक विधि (creditCardCallback, मूल टेम्पलेट में उपयोग किया गया) पास कर सकता हूं, जैसे:

export class CreditCardForm{ 
    .... 
    @Input() callback; 
    .... 

    doCallback(){ 
     this.callback({data: 123}); 
    } 
} 

// Parent view 
<credit-card-form [callback]="creditCardCallback"></credit-card-form> 

सवाल

मैं क्यों @Input से अधिक @Output का उपयोग करना चाहते हैं? इसके बजाय @Output चर का उपयोग करके मैं क्या हासिल करूं? जहां तक ​​मैं देख सकता हूं, यह EventEmitter कक्षा का उपयोग करके एक ओवरहेड जोड़ता है।

उत्तर

7

बिल्ली को त्वचा के लिए हमेशा एक से अधिक तरीके हैं। हालांकि, मेरी राय में, @Output का उपयोग कर इन लाभ हैं:

  • कोड पठनीयता: यदि सिफारिश की शैली का उपयोग कर डेटा के प्रवाह को पता करने के लिए आसान है।

  • डी-युग्मन: उदाहरण के लिए, सामान्य @Output घटना, अपने ParentComponent में के लिए, आप भेजा घटना से निपटने में और अधिक लचीलापन कर सकते हैं:

  • इतना ही नहीं बल्कि - उस में केले सक्षम बनाता है बॉक्स वाक्य रचना: में मान लें कि आपका ChildComponent आपके पास:

@Input() creditCardValue: string; @Output() creditCardValueChange: EventEmitter<string>;

तो फिर तुम दो तरह से अपने ParentComponent आसानी से बाध्यकारी हो सकता है:

<credit-card-form [(creditCardValue)]="creditCardVal"></credit-card-form> 
+0

एक महान उत्तर के लिए बहुत बहुत धन्यवाद! यह मुझे कॉलबैक के लिए '@ आउटपुट' का उपयोग करने के लिए आश्वस्त करता है। आपके उत्तर ने मुझे यह भी सिखाया कि "बॉक्स वाक्य वाक्य में केले" जैसे वाक्यांश हैं, जो गूगलिंग के दौरान कुछ मजेदार चित्रों की ओर जाता है :) –

+0

मुझे यह भी लगता है कि '@ आउटपुट' के साथ आप * संदेश युग्मन * के रूप में उपयोग कर रहे हैं '@ इनपुट 'के साथ * बाहरी युग्मन * का विरोध किया। तो अगर किसी मामले में बच्चे में '@ इनपुट' पैरामीटर अनिर्धारित है (कोई अभिभावक नहीं है?), तो आपको किसी भी 'this.callback &&.c.cbackback.call (...) 'या इसके बारे में चिंता करने की ज़रूरत नहीं है 'noOp' विधियों। लेकिन मैं ** ** ** ईवेंट-उत्सर्जन के लिए कभी भी '@ आउटपुट' का उपयोग कर देख सकता हूं - * लेकिन मुझे लगता है कि ऐप-स्केल के विपरीत घटक पैमाने पर आपके ईवेंट-प्रकार को परिभाषित करने के लिए इसका खराब डिज़ाइन; यह आपके ऐप और उसके इंजीनियरों * के लिए एंट्रॉपी बनाएगा। – Cody

+0

धन्यवाद हैरी! बस आश्चर्यचकित कारण मैं इसके लिए exaclty देख रहा था। मेरी छोटी सी समस्या यह है कि यहां से अपनी नीची शैली में कैसे स्वैप करें? <आइटम (डेटा) = "हैंडल अपडेटेड ($ ईवेंट)" [डेटा] = "नाम"> – gtamborero

-1

IMHO, @Output, एक विशाल डिजाइन दोष है के रूप में आप परिणाम के लिए इसे से निपटने प्रतिक्रिया नहीं कर सकते हैं या। इस दोष का नंबर एक उदाहरण एक बटन का क्लिक है। क्लिक करने पर, जब कार्रवाई हो रही है तो बटन को 99% मामलों को अक्षम किया जाना चाहिए। एक बार कार्रवाई हो जाने के बाद, बटन को फिर से सक्षम किया जाना चाहिए। यह वह चीज है जिसे आप तत्व में ही संभालना चाहते हैं, माता-पिता में नहीं। @Output के साथ, आप यह नहीं कर सकते हैं। @Input के रूप में एक क्रिया फ़ंक्शन का उपयोग करके, आप यह कर सकते हैं! और यदि आपका एक्शन फ़ंक्शन एक अवलोकन या वादा करता है, तो आप आसानी से इसके लिए प्रतीक्षा कर सकते हैं। इस अक्षमता को संभालने वाला एक कस्टम निर्देश बनाना आसान है, और इस प्रकार आप हर जगह [क्लिक] का उपयोग कर सकते हैं और यह उस तरह से व्यवहार करेगा।

संपादित करें: मैं नहीं कहता @Output यह का उपयोग करता है है नहीं है, लेकिन कार्य आप आदि पर प्रतीक्षा करने के लिए .... नामकरण की जरूरत के लिए नहीं अपने @Input रों अच्छा, यह भी प्रवाह, onDelete आदि की तरह स्पष्ट किया ...

+0

मैं अर्थशास्त्र का प्रशंसक नहीं हूं और व्यक्तिगत रूप से प्रतिक्रिया-शैली कॉलबैक पसंद करता हूं, लेकिन विशेष रूप से आपकी चिंताओं का जवाब देने के लिए, आपके स्रोत ईवेंट को सीधे एमिटर का संदर्भ देने की आवश्यकता नहीं है। यहां दस्तावेज़ दस्तावेज़ देखें: https://angular.io/guide/component-interaction#parent-listens-for-child-event। बच्चा घटक एक क्लिक ईवेंट को बच्चे को स्थानीय हैंडलर फ़ंक्शन पर बांधता है। बच्चे बदले में उत्सर्जक पर 'emit' कहते हैं। इवेंट प्रचार के शॉर्ट-सर्किट के लिए आप किसी भी प्रकार की सत्यापन को कल्पना करने के लिए निश्चित रूप से एक अच्छी जगह होगी। – FLGMwt

+0

हां, सच है, लेकिन आप फ़ंक्शन के परिणाम को नियंत्रित नहीं कर सकते हैं। मैं हमेशा एक घटक में कार्यों को इंजेक्ट करता हूं, जो घटक हैं, इसलिए घटक उन्हें कर सकता है, लेकिन यह नहीं पता कि वास्तव में क्या किया जाएगा। इस तरह के कार्य एक अवलोकन योग्य लौटते हैं, क्योंकि एक एसिंक कार्रवाई हो सकती है। तो हमें कार्रवाई की स्थिति के आधार पर बटन आदि को अक्षम करने का एक तरीका चाहिए ..... और आप आउटपुट के साथ ऐसा नहीं कर सकते हैं। आउटपुट के साथ आपको इनपुट और [क्लिक] के साथ इसे हमेशा करने के लिए अपने घटक पर वर्र्स रखना होगा, आप इसे अपने लिए संभालने के निर्देश में रख सकते हैं। –