कोणीय 2 में बाल घटक से मूल घटक गुण को अद्यतन करें


80

मैं @inputमूल घटक से एक संपत्ति प्राप्त करने के लिए उपयोग कर रहा हूं ताकि चाइल्ड घटक के तत्व में एक सीएसएस वर्ग को सक्रिय किया जा सके।

मैं माता-पिता से संपत्ति प्राप्त करने में सक्षम हूं और वर्ग को भी सक्रिय कर रहा हूं। लेकिन यह केवल एक बार काम करता है। माता-पिता से प्राप्त संपत्ति मैं टाइप किया गया बूलियन डेटा है और जब मैंने इसे falseचाइल्ड कंपोनेंट से सेट किया है , तो यह पैरेंट में नहीं बदलता है।

प्लंकर: https://plnkr.co/edit/58xuZ1uzvToPhPtOING2?p=preview

app.ts

import {Component, NgModule} from '@angular/core'
import {BrowserModule} from '@angular/platform-browser'
import { HeaderComponent } from './header';
import { SearchComponent } from './header/search';

@Component({
  selector: 'my-app',
  template: `
    <app-header></app-header>
  `,
})
export class App {
  name:string;
  constructor() {
  }
}

@NgModule({
  imports: [ BrowserModule ],
  declarations: [ App, HeaderComponent, SearchComponent ],
  bootstrap: [ App ]
})
export class AppModule {}

शीर्ष लेख

import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-header',
  template: `<header>
              <app-search [getSearchStatus]="isSearchActive"></app-search>
              <button (click)="handleSearch()">Open Search</button>
            </header>`
})
export class HeaderComponent implements OnInit {
  isSearchActive = false;

  handleSearch() {
    this.isSearchActive = true
    console.log(this.isSearchActive)
  }

  constructor() { }
  ngOnInit() { }
}

हेडर / सर्च.टीएस

import { Component, OnInit, Input } from '@angular/core';

@Component({
  selector: 'app-search',
  template: `<div id="search" [class.toggled]="getSearchStatus">
              search 
              <button  (click)="getSearchStatus = false" class="close">Close Search</button>
            </div>`
})
export class SearchComponent implements OnInit {
  @Input() getSearchStatus: boolean;

  constructor() { }

  ngOnInit() {

  }
}

कृपया ऊपर दिए गए प्लंकर की जांच करें। खुला खोज फ़ंक्शन केवल एक बार काम करता है। खोज बंद करने के बाद, यह फिर से ट्रिगर नहीं होता है।

क्या @inputइस परिदृश्य के लिए उचित उपयोग मामला है? कृपया इसे ठीक करने में मेरी मदद करें। (कृपया प्लंकर को अपडेट करें)।


आपने इसे कहाँ सेट किया trueथा handleSearch()?
गुंटर ज़ोचबॉएर

हैडर में / search.ts '<बटन (क्लिक करें) = "getSearchStatus = false" वर्ग = "करीब">'
शारीरिक

जवाबों:


137

आपको 2-रास्ता डेटा-बाइंडिंग का उपयोग करने की आवश्यकता है।

@Input()एक तरह से डेटा बाइंडिंग है। 2 तरह के डेटा-बाइंडिंग को सक्षम करने के लिए आपको @Output()"चेंज" प्रत्यय के साथ प्रॉपर्टी को जोड़ना होगा

@Input() getSearchStatus: boolean;
@Output() getSearchStatusChange = new EventEmitter<boolean>();

जब आप अपनी संपत्ति में किए गए परिवर्तन को माता-पिता को प्रकाशित करना चाहते हैं, तो आपको माता-पिता को सूचित करना होगा:

this.getSearchStatusChange.emit(newValue)

और माता-पिता में आपको उस संपत्ति के लिए केला-इन-द-बॉक्स नोटेशन का उपयोग करने की आवश्यकता है:

[(getSearchStatus)]="myBoundProperty"

आप संपत्ति में भी बाँध सकते हैं और बच्चे में बदलाव होने पर कॉलबैक ट्रिगर कर सकते हैं:

[getSearchStatus]="myBoundProperty" (getSearchStatusChange)="myCrazyCallback($event)"

तख्ती देखें


आपके जवाब के लिए धन्यवाद। क्या आप कृपया मेरे प्लंकर को अपडेट कर सकते हैं?
बॉडी

1
यह प्रयोग के रूप में एक ही व्यवहार के लिए अतिरिक्त काम जोड़ देगा @Output()। ऐसा लगता है कि पहिया को फिर से लगाना। @ रोबर्टवांगोर
n00dl3

2
ReactiveForms का उपयोग करते समय, यहां तक ​​कि चिह्नित मेरी बाल संपत्ति के साथ public, मैं "केला बॉक्स" दृष्टिकोण का उपयोग नहीं कर सका और त्रुटियों को मिला कि यह घटक की ज्ञात संपत्ति नहीं थी ... केवल (propertyChanged)="setParentProp($event)"पूरी तरह से काम करने के लिए बाध्य करना ।
mc01

1
मैं आपके प्रश्न का उत्तर नहीं दे सकता क्योंकि यह अपनी पोस्ट के लायक होगा। आपकी समस्या यह है कि आप माता-पिता के परिवर्तन का पता लगाने के चक्र के बाद परिवर्तन को छोड़ रहे हैं। दूसरे शब्दों में, आप कुछ परिवर्तनों को ट्रिगर करने के लिए परिवर्तन का पता लगाने में कामयाब रहे जो कि कोणीय द्वारा अनुमति नहीं है। @ मनोज
n00dl3

2
@Chandrakant nope, केले के बॉक्स सिंटैक्स का उपयोग करने के लिए आपको परिवर्तन प्रत्यय का उपयोग करना होगा। कस्टम आउटपुट के लिए, आप इसे जो चाहें नाम दे सकते हैं। केले का डिब्बा बस एक बहुत ही मूर्ख वाक्य रचना चीनी है जिसका कई लोग दुरुपयोग करते हैं
Allwe

7

एक अन्य दृष्टिकोण: विभिन्न घटकों के बीच स्थिति को पास करने के लिए rxjs / BehaviorSubject का उपयोग करें।
यहाँ प्लंकर है
मैं एक प्रत्यय 'Rxx' के साथ विषय का नाम देता हूं, इसलिए SearchStatus के लिए BehaviorSubject searchStatusRxx होगा।

  1. मूल घटक में इसे आरंभ करें जैसे searchStatusRxx = new BehaviorSubject(false);,
  2. @Input का उपयोग करके इसे चाइल्ड कंपोनेंट में पास करें
  3. बच्चे टेम्पलेट में, आप async पाइप करते हैं।
  4. माता-पिता और बच्चे दोनों में, आप searchStatusRxx.next(value)नवीनतम मूल्य को बदलने के लिए करते हैं ।

4

अपने कोड को थोड़ा संपादित किया, यह काम करता है और सरल imo दिखता है। अच्छा लगे तो मुझे बताएं।

https://plnkr.co/edit/oJOjEZfAfx8iKZmzB3NY?p=preview


धन्यवाद। मैं खोज घटक से मूल संपत्ति को अद्यतन करना चाहता हूं। यह मेरा उपयोग मामला है।
बॉडी

@ बॉडी फाइन, लेकिन आपको अपने बटन और क्लिकिंग मेकेनिज्म को संशोधित करने के तरीके पर विचार करना चाहिए, साथ में n00dl3 समाधान।
उपयोगकर्ता

2

फिर भी एक और तरीका। प्लंकर । हम जो चाहते हैं, वह सत्य का एक स्रोत है। हम इस समय उस बच्चे में डाल सकते हैं।

  • बच्चे में Init: searchStatus = false
  • माता-पिता के खाके में, बच्चे का उदाहरण #asया जो भी नाम हो, प्राप्त करें।
  • माता-पिता के उपयोग #as.searchStatusऔर बच्चे में सर्चस्टैटस को बदलें this.searchStatus

यह तरीका ज्यादा बेहतर और सरल है। क्या यह आगे बढ़ने का एक वैध तरीका है? क्यों कोणीय इस पद्धति को बढ़ावा नहीं दे रहा है? मैं एक सप्ताह से समाधान खोज रहा हूं और हर जगह मुझे इनपुट / आउटपुट के मामले मिले।
बॉडी

इसे "टेम्पलेट संदर्भ चर" के रूप में कहते हैं। यह सरल प्रतीत होता है। लेकिन यह परीक्षण करने के लिए थोड़ा कठिन हो सकता है और माता-पिता / बच्चे के घटक एक साथ युग्मन कर रहे हैं जो अच्छी बात नहीं हो सकती है। व्यक्तिगत रूप से, मैं बिहेवियरसुबजेक्ट तरीका पसंद करता हूं, जो परीक्षण और डिकॉउप करना आसान है और इसे माता-पिता और बच्चे के बीच गुजरने वाली जटिल वस्तु की संपत्ति के रूप में सेट किया जा सकता है। एक सिडनोट: कोणीय घटना ईमीटर पर्दे के पीछे का विषय है।
तीमुथोन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.