【问题标题】:Get value from another component Angular 7从另一个组件Angular 7中获取价值
【发布时间】:2019-05-10 10:26:25
【问题描述】:

我必须将组件导航栏和表单-diyalog 分开。我想在导航栏中使用 form-diyalog 中的值。

这是我的 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() {}
}

这是我的表单-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() {}
}

这是 form-diyalog.html

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

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

我可以在 form-diyalog 组件中写入 name.value,但不能在导航栏组件中写入。我怎样才能做到这一点?我试过@output,@input,但我做不到。

【问题讨论】:

  • 使用Subject怎么样?基本示例:stackblitz.com/edit/…
  • 您是否在导航栏中使用此标签?
  • 没用

标签: angular angular-material angular-cli


【解决方案1】:

您也可以使用Rxjs subject ,这里是如何创建动态主题的示例。所以每次你不需要创建一个新的主题来传递来自另一个组件的数据

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 组件你想将数据发送到另一个组件

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 // 这是一个消耗主题的组件

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 
});
}

【讨论】:

  • 在您的服务找不到名称“过滤器”后出现此错误。您指的是“文件”吗?
  • 你需要从RxJS导入filter和map。
  • 喜欢什么?从'rxjs'导入{过滤器,地图}; ?
  • 是import { filter, map } from 'rxjs/operators';
  • 我想在消费者组件的html端写响应如何?
猜你喜欢
  • 1970-01-01
  • 2020-07-18
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 2021-11-04
  • 2020-12-07
相关资源
最近更新 更多