【问题标题】:Parent-Child relation in Angular 2Angular 2中的父子关系
【发布时间】:2018-01-09 09:12:47
【问题描述】:

我有两个页面和小部件。我使用选择器在 page1 中调用 page2,并且我的小部件以相同的方式在 page2 中打开。

问题是,我可以在小部件中调用 page2 的函数。但我无法访问 page1 的属性(它们未定义)。我认为打开小部件时 page1 会死掉。 Angular结构正常吗?我可以提供那个 page1 还在运行吗?

谢谢

在第 1 页视图中:

<page2></page2>

在 page2 视图中:

<widget><widget>

还有我的小部件的 .ts 文件。

_page2.Test2()  //it's ok

我可以通过这种方式访问​​。我在小部件的构造函数中定义了 _page2。 但我无法定义_page1。它给出了“无提供者”错误。

_page1.Test1()  // this is not possible.

这可能是关于什么的?并且有两个页面有 NgModule。 Page2 没有抛出提供程序错误,但 page1 做到了。

【问题讨论】:

  • 请添加代码。
  • 我会尽快做的。这有点复杂。 :)
  • 不要发布复杂的代码。首先将代码减少到允许重现问题的绝对最小值。

标签: angular typescript


【解决方案1】:

我假设你的代码应该是这样的?

app.html

<page1></page1>

page1.html

<page2></page2>

page2.html

<widget1></widget1>
<widget2></widget2>

在这种情况下,您有多种解决方案。首先,像这样将第 1 页的引用注入到您的小部件中

constructor(
  @Inject(forwardRef(() => PageOneComponent)) private page1: PageOneComponent,
) {}

在任何人告诉你不要这样做之前:是的,这是一种不好的做法,因为它会产生强烈的依赖关系。但这回答了这个问题。

第二个选项是创建视图子级并动态分配它们的值:

page1 HTML & TS

<page2 #p2></page2>
@ViewChild(PageTwoComponent) p2: PageTwoComponent;

page2 HTML & TS

<widget1 #w1></widget1>
<widget2 #w2></widget2>
@ViewChild(WidgetOneComponent) w1: WidgetTwoComponent;
@ViewChild(WidgetTwoComponent) w2: WidgetTwoComponent;

小部件 TS

page1: PageOneComponent;

现在,在你的第一个组件中,你可以这样做

this.p2.w1.page1 = this;
this.p2.w2.page1 = this;

但这很恶心,你不应该这样做

第三种解决方案,使用带有主题的服务。

服务

export class MyService {
  onEvent: Subject<any> = new Subject();

  propagate() { this.onEvent.next(null); }
}

小部件

constructor(private service: MyService) {
  // you can call
  service.propagate();
}

第 1 页

// Subscribe to the propagation
this.service.onEvent.subscribe(() => { this.myMethod(); });

应该这样做

【讨论】:

  • 我以前试过这种方法。但他们没有给出结果。我的问题是 page1 在这段时间内没有运行。我认为这与我的项目结构有关。
  • 其中一些方法绝对搞砸了(尤其是第一个),我怀疑您是否尝试了所有这些方法...但是如果您的第 1 页没有运行,这意味着您的应用程序没有跑步,对吧?
  • 我的应用程序仍在运行。我可以顺利使用小部件。但我必须从 page1 调用函数。在我无法访问它们之后,因为它们是未定义的。
  • 如果您的小部件来自第 2 页,而第 2 页来自第 1 页,那么如果您没有“运行”第 1 页,那么您将没有第 2 页和标题!
  • 我通过 page2 打开小部件,通过 page1 打开 page2。没问题,但是如果我想回到page1,我就无法访问它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-13
  • 2017-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多