Mustafa Gönen
Mustafa Gönen

Reputation: 99

Get value from another component Angular 7

I have to separate component navbar and form-diyalog. I want to use an value from form-diyalog in navbar.

This is my navbar.ts

import { Component, OnInit } from "@angular/core";
import { MenuItemModels } from "./models/MenuItemModel";

@Component({
  selector: "app-navbar",
  templateUrl: "./navbar.component.html",
  styleUrls: ["./navbar.component.css"]
})
export class NavbarComponent implements OnInit {
  MenuItem: MenuItemModels[] = [
    { name: "Anasayfam", link: "#" },
    { name: "Hakkımızda", link: "#" },
    { name: "Üniversitemiz", link: "#" },
    { name: "Fakültelerimiz", link: "#" },
    { name: "Bize Ulaşın", link: "#" }
  ];
  addItem() {
    let customObj = new MenuItemModels();
    customObj.name = customObj.link = "#";
    this.MenuItem.push(customObj);
  }

  deleteItem(i) {
    this.MenuItem.splice(i, 1);
  }

  constructor() {}

  ngOnInit() {}
}

This is my form-diyalog.ts

import { Component, OnInit, Input, Output } from "@angular/core";
import { FormControl } from "@angular/forms";

@Component({
  selector: "app-form-diyalog",
  templateUrl: "./form-diyalog.component.html",
  styleUrls: ["./form-diyalog.component.css"]
})
export class FormDiyalogComponent implements OnInit {
  name = new FormControl("");

  constructor() {}

  ngOnInit() {}
}

and this is form-diyalog.html

    <label>
    Menu Name:
    <input type="text" [formControl]="name">
    </label>

    <p>
    Value: {{ name.value }}
    </p>

I can write name.value in form-diyalog component but i cant it in navbar component. How i can achieve this? I tried @output, @input but i could't.

Upvotes: 0

Views: 1028

Answers (1)

Yash Rami
Yash Rami

Reputation: 2327

You can use Rxjs subject for the same here is the example of how you can create a dynamic subject. so every time you don't need to create a new subject to pass the data from another component

BrodcastService.ts

interface Event {
  key: string;
  value: any;
}


@Injectable({
  providedIn: 'root'
})

export class Broadcaster {

  // subject 
  protected _eventsSubject = new Subject<Event>();
  constructor() {
  }

   broadcast(key: any, value: any) {
    this._eventsSubject.next({ key, value }); // here we are setting the key and value of our subject
   }

  on<T>(key: any): Observable<T> {
    return this._eventsSubject.asObservable()
            .pipe(
                filter(e => e.key === key),
                map(e => e.value)
            );
  }
}

ComponentOne.ts component you want to send the data to another component

import { Broadcaster } from '../BrodcastService.service';
export class ComponentOne implements OnInit {
constructor(private broadcaster: Broadcaster) { }

someFunction() {
         this.broadcaster.broadcast('errorMessage', 'some error');
//         this.broadcaster.broadcast('errorMessage', {err: 'some error'});
// you can also pass the object
}

componentTwo.ts // this is a component which consume the subject

import { Broadcaster } from '../BrodcastService.service';
export class componentTwo implements OnInit {
constructor(private broadcaster: Broadcaster) { }

someFunction() {
this.broadcaster.on('errorMessage').subscribe(response => { 
 console.log(response); // here you are getting the data from the other component 
});
}

Upvotes: 1

Related Questions