Reputation: 99
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
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