2016-01-02 3 views
7

क्या आप angular2 में घटक गुण को म्यूट करते समय प्रोग्रामर रूप से कोणीय के परिवर्तन का पता लगा सकते हैं?ngOnChanges फायरिंग नहीं करते जब इनपुट प्रॉपर्टी बदल जाती है

@Component({ 
    selector: 'my-component', 
}) 
class MyComponent implements OnChanges { 
    @Input() message: string; 

    ngOnChanges(changeRecord) { 
     for (var change in changeRecord) { 
     console.log('changed: ' + change); 
     } 
    } 

    doSomething() { 
    // I want ngOnChanges to be called some time after I set the 
    // message. Currently it is only called if the host element 
    // changes the value of [message] on the element. 
    this.message = 'some important stuff'; 
    } 
} 
+3

मैन्युअल रूप से परिवर्तन पहचान को चलाने के लिए, ApplicationRef.tick() का उपयोग करने का प्रयास करें। हालांकि, मुझे विश्वास नहीं है कि ngOnChanges() को कॉल किया जाएगा, क्योंकि मेजबान संपत्ति में बदलाव नहीं आया था। आप बच्चे के घटक में एक बाल संपत्ति क्यों बदल रहे हैं जो एक इनपुट संपत्ति है? –

+0

उपरोक्त कोड वास्तविक कोड नहीं है, मैं बस इस मुद्दे का प्रदर्शन करने के लिए इसका उपयोग कर रहा था। मेरा वास्तविक कोड एक यूनिट परीक्षण है और मैंने 'TestComponentBuilder' का उपयोग कर घटक का एक उदाहरण प्राप्त किया है। मैं इकाई संदेश कोड को 'संदेश' संपत्ति के मान को संशोधित करना चाहता हूं और यह जांचने के लिए कि 'ngOnChanges' में कोड से एक ईवेंट उत्सर्जित किया गया है। लेकिन कुछ घंटों के बाद सिर खरोंच करने के बाद मैं इसे पूरा करने के किसी भी तरीके से नहीं समझ सकता। मैंने 'डीबगलेमेंट' पर 'देशी एलिमेंट' को किसी भी प्रभाव के लिए संशोधित करने का भी प्रयास नहीं किया है। – ovangle

+0

मैं 'ComponentFixture.modifyHostBinding (प्रॉपर्टी: स्ट्रिंग, न्यूवैल्यू: कोई भी)' या कुछ समान जैसा तरीका ढूंढ रहा था, लेकिन ऐसा कुछ प्रतीत नहीं होता है, इसलिए मैंने एक और सामान्य सवाल उठाया। – ovangle

उत्तर

1

वहाँ एक इनपुट this पर बाध्यकारी को संशोधित करने और यह परिवर्तन का पता लगाने के दौरान पता लगाने के लिए कोई रास्ता नहीं हो रहा है। लेकिन यह एक और घटक में पूरे घटक लपेटकर द्वारा इकाई परीक्षण मैं लिख रहा था ठीक करने के लिए

@ng.Component({ 
    selector: 'my-host-component', 
    template: '<my-component [message]="message" (change)="change.emit($event)"></my-component>' 
    directives: [MyComponent] 
}) 
class MyHostComponent { 
    message: string; 
    change = new EventEmitter<any>(); 
} 

मैं तो MyHostComponent पर परीक्षण भाग गया, बल्कि MyComponent से संभव हो गया था।

मैंने issue to angular सबमिट किया है कि यह अनुरोध ComponentFixture में जोड़ा गया है ताकि इस तरह के परीक्षण लिखना आसान हो।

2

मुझे एक ही समस्या थी, और यह एक साधारण लेकिन बहुत ही सुरुचिपूर्ण कामकाज है जिसका मैं उपयोग कर रहा हूं। एक और संपत्ति में दर्रा ट्रिगर ngOnChanges विधि के लिए मजबूर करने

<div poll-stat-chart [barData]="barData" [changeTrigger]="changeTrigger"></div> 

माता पिता घटक वर्ग में, जब भी आप मैन्युअल रूप से बच्चे के घटक पर ngOnChanges विधि सक्रिय करना चाहते हैं, बस संशोधित "changeTrigger" संपत्ति

ParentComponent क्लास (poll- स्टेट-चार्ट बच्चे घटक)

 @Component({ 
     directives: [PollStatChartCmp], 
     template: ` 
      <div poll-stat-chart [barData]="barData" [changeTrigger]="changeTrigger"> 
      </div> 
      <button (click)="triggerChild()"></button> 
     ` 
     } 
    export class ParentComponent { 
     changeTrigger = 1; 
     barData = [{key:1, value:'1'}, {key:2, value'2'}]; 
     triggerChild() { 
      this.barData[0].value = 'changedValue'; 

      //This will force fire ngOnChanges method of PollStatChartComponent 
      this.changeTrigger ++ ;   
     } 

    } 

और फिर बच्चे घटक कक्षा में, एक संपत्ति [changeTrigger]

जोड़ने है
@Component({ 
     selector: '[poll-stat-chart]', 
     inputs: ['barData', 'changeTrigger'], 
     template: ` 
      <h4>This should be a BAR CHAR</h4> 
     ` 
    }) 
    export class PollStatChartCmp { 
     barData; 
     changeTrigger; 
     constructor(private elementRef: ElementRef) { 
      this.render(); 

     } 

     ngOnChanges(changes) { 
      console.log('ngOnChanges fired'); 
      this.render(); 
     } 

     render() { console.log('render fired');} 

} 
+0

इस तरह के एक सुरुचिपूर्ण हैक । –

2

क्यों एक समारोह बनाने नहीं वांछित उत्परिवर्तन संभालने के लिए और ngOnChanges और doSomething दोनों में इसे कहते हैं जिस तरह से overkilling मैन्युअल परिवर्तन का पता लगाने पर कॉल करना चाहते हैं या इस के लिए एक समाधान पर बहुत समय खर्च किया जाता है,? कुछ की तरह:

@Component({ 
    selector: 'my-component', 
}) 
class MyComponent implements OnChanges { 
    @Input() message: string; 
    viewMessage: string; 

    ngOnChanges(changes: { [propertyName: string]: SimpleChange }) { 
    for (let propName in changes) { 
     if (propName === 'message') { 
     this.updateView(this.message); 
     } 
    } 
    } 

    doSomething() { 
    this.viewMessage = 'some important stuff'; 
    } 

    updateView(message: string) { 
    this.viewMessage = message; 
    } 
} 

तो viewMessage विशेषता आप का उपयोग किया जाएगा और टेम्पलेट को नियंत्रित किया जाएगा।

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