2016-03-08 22 views
15

तो मान लें कि आपके पास एक इंटरफ़ेस है जिसमें टूलबार, साइडबार और ग्रिड है। टूलबार में एक ड्रॉप-डाउन होता है जब कोई उपयोगकर्ता बदलता है, साइडबार और ग्रिड में सामग्री बदल जाती है। कोणीय 1 में वापस, मैं अपने सभी गतिशील डेटा रखने के लिए एक सेवा का उपयोग करता हूं। जब सेवा में कुछ बदलाव होता है, तो उस सेवा का उपयोग करने वाले सभी घटक भी अपडेट होंगे।कोणीय 2 - घटकों के बीच डेटा/परिवर्तन कैसे साझा करें

अच्छी तरह से कोणीय 2 में, ऐसा लगता है कि लोग विभिन्न तरीकों का उपयोग कर रहे हैं। मैं आपका इनपुट प्राप्त करना चाहता था जिस पर पसंदीदा तरीका है।

  • स्टेटिक सेवा
  • OnChanges
  • इनपुट और आउटपुट

अपडेट किया गया - 03/09/16

सबसे अच्छा समाधान की तरह लग रहा थ्रेड है थियरी टेम्पलर पोस्ट किया गया: Delegation: EventEmitter or Observable in Angular2

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

See Plnkr for code 

Original Plunker - केवल एक सेवा है जो वस्तु में सभी डेटा संग्रहीत करता है - हर परिवर्तन से उसकी अपनी सेवा

Revised Plunker for example होगा। प्रत्येक श्रोता को यह जांचने के लिए एक प्रकार दिया जाएगा कि उसे उस प्रकार के आधार पर कुछ भी करने की आवश्यकता है या नहीं।

+1

दूसरों अच्छा जवाब प्रदान की लेकिन ध्यान देने योग्य का एक वर्ग है कि वहाँ चाहते थे [घटक इंटरैक्शन] पर दस्तावेज़ [https://angular.io/docs/ts/latest/cookbook/component-communication.html) कि माँ y भी पढ़ने के लायक हो। – jandersen

उत्तर

21

आप इस के लिए साझा सेवा का लाभ उठाने सकता है। डेटा अपडेट होने पर अधिसूचित होने के लिए सदस्यता लेने के लिए डेटा और अवलोकन दोनों हो सकते हैं।

  • सेवा

    export class ListService { 
        list1Event: EventEmitter<any> = new EventEmitter(); 
    
        getLists() { 
        return this.http.get(url).map(res => res.json()) 
         .subscribe(
         (data) => { 
          this.list1Event.emit(data.list1); 
         } 
        ); 
        } 
    } 
    
  • घटक

    @Component({ 
        selector: 'my-component1', 
        template: ` 
        <ul> 
        <li *ngFor="#item of list">{{item.name}}</li> 
        </ul> 
        ` 
    }) 
    export class MyComponent1 { 
        constructor(private service:ListService) { 
        this.service.list1Event.subscribe(data => { 
         this.list = data; 
        }); 
        } 
    } 
    
  • बूटस्ट्रैप

    bootstrap(AppComponent, [ ListService ]); 
    

अधिक जानकारी के लिए इस सवाल का देखें:

+0

उत्कृष्ट उत्तर, हालांकि आपके द्वारा लिंक किए गए इवेंटमीटर-या-देखने योग्य फ़ोरम में उल्लेख किया गया है, ऐसा लगता है कि देखने योग्य बेहतर तरीका है। मैं अभी इसे आज़माउंगा और देख सकता हूं कि यह मेरे लिए कैसे काम करता है। –

2

आपके उपयोग के मामले में मैं सेवाओं का उपयोग करूंगा। सेवाओं का उपयोग अन्य घटकों को अपने डेटा को संवाद करने के लिए किया जाता है। एक घटक सेवा को इस डेटा को अपडेट कर सकता है, और दूसरा घटक इससे पढ़ सकता है। या दोनों घटक सिर्फ इससे पढ़ सकते हैं, और सर्वर को स्वयं को 'बाहरी दुनिया' से डेटा प्राप्त हो जाता है।

आप माता-पिता से बच्चे को डेटा के साथ पास करने के लिए input का उपयोग करते हैं और आप बच्चे से माता-पिता को आउटपुट ईवेंट के लिए output का उपयोग करते हैं।

आप ngOnChanges का उपयोग कुछ करने के लिए जब कुछ घटक अपने आप में बदलता है, लेकिन मुझे लगता है कि के लिए get() और set() कार्यों का उपयोग करने के लिए पसंद करते हैं।

कम से कम, कि मेरी ले है पर यह :)

+0

प्रत्येक का उपयोग कब करें पर उत्कृष्ट विवरण के लिए धन्यवाद। यह भविष्य में मेरे लिए वास्तव में आसान होगा। मैं इवेंटइमीटर बनाम अवलोकननीय थ्रेड में उल्लिखित अवलोकन सेवा दृष्टिकोण के साथ जा रहा हूं जिसे @ थिरी ने उल्लेख किया है। –

+0

तो मेरे पास घटनाओं बनाम ngOnChanges का उपयोग करने के बारे में आपके विवरण पर एक फॉलो अप प्रश्न है। तो मान लें कि मेरे पास एक मूल घटक है जो साझा बच्चे कॉम्पोनेंट ग्रिड का उपयोग करता है। साझा करके, मेरा मतलब है कि कई अन्य घटक इस ग्रिड का उपयोग अपने डेटा को प्रदर्शित करने के लिए करते हैं। तो अगर मैं माता-पिता को इस बच्चे (ग्रिड) के अंदर एक फ़ंक्शन कॉल करना चाहता हूं, लेकिन केवल इस उदाहरण में अन्य सभी नहीं, तो इस मामले के लिए ngOnChanges सबसे अच्छा उपयोग होगा? –

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