कोणीय 2 घटक गुणों के लिए डिफ़ॉल्ट मान कैसे सेट करें?


101

कोणीय 2.0 घटकों को लिखते समय, गुणों के लिए डिफ़ॉल्ट मान कैसे सेट करता है?

उदाहरण के लिए - मैं सेट करना चाहते fooकरने के लिए 'bar'डिफ़ॉल्ट रूप से, लेकिन बाध्यकारी हो सकता है तुरंत करने के लिए हल 'baz'। यह जीवन चक्र हुक में कैसे खेलता है?

@Component({  
    selector: 'foo-component'
})
export class FooComponent {
    @Input()
    foo: string = 'bar';

    @Input()
    zalgo: string;

    ngOnChanges(changes){
          console.log(this.foo);
          console.log(changes.foo ? changes.foo.previousValue : undefined);
          console.log(changes.foo ? changes.foo.currentValue : undefined);
    }
}

निम्नलिखित टेम्पलेट्स को देखते हुए, यह वही है जो मुझे लगता है कि मान होगा। क्या मै गलत हु?

<foo-component [foo] = 'baz'></foo-component>

कंसोल पर लॉग इन करें:

'baz'
'bar'
'baz'
<foo-component [zalgo] = 'released'></foo-component>

कंसोल पर लॉग इन करें:

'bar'
undefined
undefined

जब आप इसे आज़माते हैं तो क्या होता है?
जेबी निज़ेट

1
@BryanRayner जिस तरह से वर्तमान में कंसोल प्रिंट हो रहे हैं वे सही हैं..आपको क्या समस्या है?
पंकज पारकर

6
मैं वर्तमान में समस्या का सामना नहीं कर रहा हूं, बस इच्छित व्यवहार पर स्पष्टीकरण मांग रहा हूं। जब मुझे अपनी जिज्ञासा का जवाब नहीं मिला, तो मैंने फैसला किया कि मैं सवाल पूछूंगा अगर दूसरों में स्पष्टता की इच्छा थी।
ब्रायन रेनर

आपके उदाहरण में आप @Input ()
kitimenpolku

जवाबों:


142

यह दिलचस्प विषय है। आप यह पता लगाने की यह कैसे काम करता दो जीवन चक्र हुक के साथ चारों ओर खेल सकते हैं: ngOnChangesऔर ngOnInit

मूल रूप से जब आप डिफ़ॉल्ट मान को सेट करते हैं तो Inputइसका मतलब है कि इसका उपयोग केवल उस स्थिति में किया जाएगा जब उस घटक पर कोई मूल्य नहीं होगा। और घटक शुरू होने से पहले दिलचस्प हिस्सा इसे बदल दिया जाएगा।

मान लें कि हमारे पास दो जीवन चक्र हुक और एक संपत्ति से आने वाले ऐसे घटक हैं input

@Component({
  selector: 'cmp',
})
export class Login implements OnChanges, OnInit {
  @Input() property: string = 'default';

  ngOnChanges(changes) {
    console.log('Changed', changes.property.currentValue, changes.property.previousValue);
  }

  ngOnInit() {
    console.log('Init', this.property);
  }

}

स्थिति 1

परिभाषित propertyमूल्य के बिना HTML में घटक शामिल हैं

परिणामस्वरूप हम कंसोल में देखेंगे: Init default

इसका मतलब onChangeयह नहीं था कि ट्रिगर किया गया। Init ट्रिगर किया गया था और propertyमूल्य defaultउम्मीद के मुताबिक है।

स्थिति 2

एचटीएमएल में निगमित संपत्ति के साथ घटक <cmp [property]="'new value'"></cmp>

परिणामस्वरूप हम कंसोल में देखेंगे:

Changed new value Object {}

Init new value

और यह एक दिलचस्प है। सबसे पहले ट्रिगर किया गया था onChangeहुक, जो setted propertyलिए new value, और पिछले मूल्य था खाली ऑब्जेक्ट ! और उसके बाद ही onInitहुक को नए मूल्य के साथ चालू किया गया था property


8
क्या इस व्यवहार के लिए आधिकारिक डॉक्स से कोई लिंक है? इसके पीछे तर्क और तर्क को समझने के लिए अच्छा होगा, यह भी ट्रैक करने में सक्षम होगा कि व्यवहार प्रति संस्करण क्या है।
ब्रायन रेनर

मैंने इस तरह की जानकारी नहीं देखी है, उपरोक्त सभी मेरी अपनी जांच है। मुझे लगता है कि आप अधिक जवाब पा सकते हैं यदि आप संकलित जेएस फाइलें पढ़ेंगे
मिक्की

1
मैं @Inputडिफ़ॉल्ट मान होने पर प्रलेखन की तलाश कर रहा था । @slicepan के पास घटक जीवन चक्र के लिए डॉक्स के लिए एक लिंक है, लेकिन मैंने प्रलेखन में उपयोग किए गए डिफ़ॉल्ट मान को नहीं देखा।
nycynik

@nycynik बस डिफ़ॉल्ट मानों के लिए इसका उपयोग करते हैं:@Input() someProperty = 'someValue';
magikMaker

1
आप जीवन रक्षक हैं। इससे मेरे सिर में चोट लगी, जबकि AngularJS ऐप से Angular 7.x
Andris

9

यहाँ इसके लिए सबसे अच्छा समाधान है। (ANGULAR सभी संस्करण)

समाधान को संबोधित करना : @Input चर के लिए एक डिफ़ॉल्ट मान सेट करना । यदि कोई मूल्य उस इनपुट वैरिएबल को पारित नहीं किया गया तो यह डिफ़ॉल्ट मान लेगा

मैंने इस तरह के समान प्रश्न के लिए समाधान प्रदान किया है। आप यहाँ से पूरा समाधान पा सकते हैं

export class CarComponent implements OnInit {
  private _defaultCar: car = {
    // default isCar is true
    isCar: true,
    // default wheels  will be 4
    wheels: 4
  };

  @Input() newCar: car = {};

  constructor() {}

  ngOnInit(): void {

   // this will concate both the objects and the object declared later (ie.. ...this.newCar )
   // will overwrite the default value. ONLY AND ONLY IF DEFAULT VALUE IS PRESENT

    this.newCar = { ...this._defaultCar, ...this.newCar };
   //  console.log(this.newCar);
  }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.