【问题标题】:How to access parent component properties from a child route component in Angular?如何从 Angular 中的子路由组件访问父组件属性?
【发布时间】:2018-02-27 10:23:06
【问题描述】:

我是 Angular 的新手,我被困在那里。 我知道如何通过将 [parentData]="var" 注入子选择器 .

在父组件和子组件之间共享数据

但是当使用路由时;我只有一个路由器插座,无法将 [parentData] 绑定到它,因为它会引发错误。

从子路由访问父属性的最佳和最简单的方法是什么?

项目在stackblitz here

我需要在子组件中显示产品(来自父组件)。

版本:(Angular 5)

【问题讨论】:

标签: javascript angular routes parent-child


【解决方案1】:

是的,这很简单,当你想传递给router-outlet 中的组件时,你需要使用services,实际上在你去正确的路径之前该组件在模板中不存在,所以通常绑定不要在这里工作。

所以解决这个问题的最好方法是创建一些简单的服务

在服务中

import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';

@Injectable()
export class DataTransferService {

  private products= new BehaviorSubject<any>([]);
  cast= this.products.asObservable();

  sendAnything(data) {
    this.products.next(data);
  }

}

然后将您的服务注入到父组件和子组件的构造函数中

在父组件中

 constructor(private dataTransfer: DataTransferService){}

然后创建一个方法

 shareData(data){
    this.dataTransfer.sendAnything(data) // to send something
}

并从 parent.component.html 调用它

(click)="shareData(data)" // data is the parent data that you want to share

在子组件中

在ngOnInit方法里面添加:

 ngOnInit() {
   this.dataTransfer.products.subscribe(res=> this.var = res) // var is the property that you want to assign the data to it.
 }

获取数据并使用它。
更多信息和示例您可以在doc中找到

【讨论】:

  • 非常感谢您的回答,我现在就试试。但是我之前没用过Subjects,yourVariable、sourceProductName、sourceYourVariable代表什么?
  • 对不起,我在那里打错了字。 Subject 是一种我们可以控制并调用 .next() 方法将新值发送到流的可观察对象,yourVariable 是一个实际的可观察对象,您可以订阅和收听从应用程序中其他位置发送的任何内容
  • 我已经编辑了答案,以帮助其他像我一样开始学习角度的人。我花时间搜索并弄清楚如何使用分析器,因此对我的反对意见是不公平的。谢谢
  • 如果它是正确的,您需要检查它作为正确答案。没问题,希望对您有所帮助1
  • 如果你提出,你会删除否决票吗?
【解决方案2】:

一方面,您不能将输入传递给 router-outlet 标签,因为路由器添加的组件将是标签的兄弟,不会替换它。

另一方面,当您的 Angular 应用程序变得越来越复杂时,将相同的输入从父组件传递给子组件将不再是正确的处理方式..

在您的情况下,处理 products 变量的最佳方法是将其声明为 products 服务中的行为主题:

   prodcuts:Subject<IProducts[]> = new BehaviorSubject<IProducts[]>([]);

在父组件中,你发送接收到的数据:

ngOnInit() { 
    this._productsService.getProducts()
        .subscribe(
          data => {this.products = data;
          this._productsService.prodcuts.next(data);
          },
          error => this.errMsg = error
        );    
}

最后,在子客户端中你必须订阅服务中声明的行为主体:

export class ChildComponent implements OnInit {
public products = [];

constructor(private _productsService: ProductsService ) { 
}

ngOnInit() {
    this._productsService.prodcuts
    .subscribe(
      data => {
       {this.products = data;
      }
    );    
  } 
}

【讨论】:

  • 这似乎是一个有效的解决方案,我会尽快尝试。谢谢
  • 感谢您将我以前的代码与 productService 一起应用,为简单起见,我稍后对其进行了更新,但您的代码对我来说会很有帮助。将在几个小时内完成,非常感谢您
  • 您能否解释一下:在子组件中,订阅产品和订阅 getProducts() 有什么区别,就像我们在父组件中所做的那样?我不清楚。
猜你喜欢
  • 1970-01-01
  • 2019-11-23
  • 2019-06-15
  • 1970-01-01
  • 1970-01-01
  • 2017-02-18
  • 1970-01-01
  • 2020-07-10
  • 2014-04-05
相关资源
最近更新 更多